hdu4396More lumber is required(二维SPFA)(多校10)
http://acm.hdu.edu.cn/showproblem.php?pid=4396
二维最短路 以这个点和到这个点的路径数作为一个点来标记
View Code
1 #include <iostream> 2 #include<cstdio> 3 #include<string.h> 4 #include<queue> 5 #define INF 0xfffffff 6 using namespace std; 7 struct node 8 { 9 int v,w,next; 10 }men[200011]; 11 struct mode 12 { 13 int v,num; 14 }; 15 int first[5011],f[5011][511],s,t,k,p[5011][511]; 16 void init() 17 { 18 t = 0; 19 memset(first,-1,sizeof(first)); 20 } 21 void add(int u,int v,int w) 22 { 23 men[t].v = v; 24 men[t].w = w; 25 men[t].next = first[u]; 26 first[u] = t; 27 t++; 28 } 29 void spfa(int n) 30 { 31 int i,j,v,num; 32 memset(f,0,sizeof(f)); 33 for(i = 1; i<= n ; i++) 34 { 35 for(j = 0 ; j <= k ; j++) 36 p[i][j] = INF; 37 } 38 queue<mode>qq; 39 mode kk; 40 kk.v = s; 41 kk.num = 0; 42 f[s][0] = 1; 43 qq.push(kk); 44 p[s][0] = 0; 45 while(!qq.empty()) 46 { 47 mode tt = qq.front(); 48 v = tt.v; 49 num = tt.num; 50 f[v][num] = 0; 51 qq.pop(); 52 for(i = first[v] ; i!=-1 ; i = men[i].next) 53 { 54 int tv = men[i].v; 55 int tw = men[i].w; 56 num = tt.num+10; 57 if(num>=k) 58 num = k; 59 if(p[tv][num]>p[v][tt.num]+tw) 60 { 61 p[tv][num] = p[v][tt.num]+tw; 62 if(!f[tv][num]) 63 { 64 mode tk; 65 tk.v = tv; 66 tk.num = num; 67 qq.push(tk); 68 f[tv][num] = 1; 69 } 70 } 71 } 72 } 73 } 74 int main() 75 { 76 int i,j,n,m,u,v,w; 77 while(scanf("%d%d", &n,&m)!=EOF) 78 { 79 init(); 80 for(i = 1; i <= m ;i++) 81 { 82 scanf("%d%d%d",&u,&v,&w); 83 add(u,v,w); 84 add(v,u,w); 85 } 86 scanf("%d%d%d",&s,&t,&k); 87 spfa(n); 88 if(p[t][k]==INF) 89 printf("-1\n"); 90 else 91 printf("%d\n",p[t][k]); 92 } 93 return 0; 94 }