#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> using namespace std; #define maxn 2008 #define maxm 2000008 #define INF 2000000000 int lt[maxn],LT[maxn],sum=1,SUM=1; int h[maxn]; int s,t,k,n,m; bool pd[maxn]; struct line{ int u,v,w,nt; }eg[maxm],EG[maxm]; inline void add(int u,int v,int w){ eg[++sum].u=u; eg[sum].v=v; eg[sum].w=w; eg[sum].nt=lt[u]; lt[u]=sum; } inline void ADD(int u,int v,int w){ EG[++SUM].u=u; EG[SUM].v=v; EG[SUM].w=w; EG[SUM].nt=LT[u]; LT[u]=SUM; } inline void read(int &x){ char ch; for (ch=getchar();ch<‘0‘||ch>‘9‘;ch=getchar()); x=ch-48; for (ch=getchar();ch>=‘0‘&&ch<=‘9‘;ch=getchar()) x=x*10+ch-48; } inline void spfa(){ queue<int> Q; for (int i=1;i<=n;i++) h[i]=INF; memset(pd,0,sizeof(pd)); h[t]=0; pd[t]=1; Q.push(t); while (!Q.empty()){ int u=Q.front(); Q.pop(); for (int i=LT[u];i;i=EG[i].nt){ int v=EG[i].v; if (h[u]+EG[i].w<h[v]){ h[v]=h[u]+EG[i].w; if (!pd[v]){ pd[v]=1; Q.push(v); } } } pd[u]=0; } } class node{ public: int f,g,u; bool operator<(const node& t) const{ return f>t.f; } node(int a,int b,int c):f(a),g(b),u(c){} node(){} }; int iQ[maxn]; inline int A_star(){ priority_queue<node> Q; memset(iQ,0,sizeof(iQ)); iQ[s]=0; Q.push(node(h[s],0,s)); while (!Q.empty()){ node cur=Q.top(); //printf("%d %d %d %d\n",cur.f,cur.g,cur.u,iQ[t]); Q.pop(); iQ[cur.u]++; if (iQ[t]==k) return cur.f; if (iQ[cur.u]>k) continue; for (int i=lt[cur.u];i;i=eg[i].nt){ int v=eg[i].v; Q.push(node(h[v]+cur.g+eg[i].w,cur.g+eg[i].w,v)); } } return -1; } inline int main(){ //freopen("1.in","r",stdin); read(n); read(m); for (int i=1;i<=m;i++) { int u,v,w; read(u); read(v); read(w); add(u,v,w); ADD(v,u,w); } read(s); read(t); read(k); if (s==t) k++; spfa(); //for (int i=1;i<=n;i++) printf("%d ",h[i]); printf("%d\n",A_star()); return 0; }
时间: 2024-10-11 09:45:10