Time Limit: 4000MS | Memory Limit: 65536K | |
Total Submissions: 21549 | Accepted: 5862 |
Description
Input
Output
Sample Input
2 2 1 2 5 2 1 4 1 2 2
Sample Output
14
#include"stdio.h" #include"string.h" #include"iostream" #include"map" #include"string" #include"queue" #include"stdlib.h" #include"algorithm" #include"math.h" #define M 1009 #define eps 1e-10 #define inf 100000000 #define mod 100000000 #define INF 0x3f3f3f3f using namespace std; struct Lnode { int u,v,w,next; }edge[M*300]; int t,head[M],h[M],num[M],use[M]; void init() { t=0; memset(head,-1,sizeof(head)); } void add(int u,int v,int w) { edge[t].u=u; edge[t].v=v; edge[t].w=w; edge[t].next=head[u]; head[u]=t++; } void dijstra(int n,int s) { int i,j; memset(use,0,sizeof(use)); memset(h,INF,sizeof(h)); h[s]=0; for(i=1;i<=n;i++) { int mini=INF; int tep=-1; for(j=1;j<=n;j++) { if(!use[j]&&h[j]<mini) { mini=h[j]; tep=j; } } if(tep==-1)break; use[tep]=1; for(j=head[tep];j!=-1;j=edge[j].next) { int v=edge[j].v; if(h[v]>h[tep]+edge[j].w) h[v]=h[tep]+edge[j].w; } } } struct node { int v,g,h; friend bool operator<(node a,node b) { return a.g+a.h>b.g+b.h; } }; int bfs(int n,int s,int t,int k) { int i; priority_queue<node>q; memset(num,0,sizeof(num)); node cur; cur.v=s; cur.g=0; cur.h=h[s]; q.push(cur); while(!q.empty()) { cur=q.top(); q.pop(); num[cur.v]++; if(num[cur.v]>k)continue; if(num[t]==k&&t==cur.v)return cur.g; for(i=head[cur.v];i!=-1;i=edge[i].next) { int v=edge[i].v; node now; now.v=v; now.g=cur.g+edge[i].w; now.h=h[v]; q.push(now); } } return -1; } struct line { int a,b,c; }e[M*300]; int main() { int n,m,i,start,endl,k; while(scanf("%d%d",&n,&m)!=-1) { init(); for(i=1;i<=m;i++) { scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].c); add(e[i].b,e[i].a,e[i].c); } scanf("%d%d%d",&start,&endl,&k); if(start==endl)k++;//注意的地方 dijstra(n,endl); init(); for(i=1;i<=m;i++) add(e[i].a,e[i].b,e[i].c); int ans=bfs(n,start,endl,k); printf("%d\n",ans); } return 0; }