HDU 4396 More lumber is required(二维SPFA)
第一个二维的,注意一点如果num + 1 > w,num = w 这样就可以节约空间了,因为假如经过很多条边而且是最短路的话,无法存储。。
1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 using namespace std; 5 #define INF 0x7fffffff 6 struct node 7 { 8 int u,v,next,w; 9 }edge[300001]; 10 int first[5001]; 11 int t,n; 12 int dis[5001][53]; 13 bool in[5001][53]; 14 void CL() 15 { 16 t = 1; 17 memset(first,-1,sizeof(first)); 18 } 19 void add(int u,int v,int w) 20 { 21 edge[t].u = u; 22 edge[t].v = v; 23 edge[t].w = w; 24 edge[t].next = first[u]; 25 first[u] = t ++; 26 } 27 int spfa(int sv,int ev,int w) 28 { 29 int i,j,u,v,num,temp; 30 queue< pair<int,int> > que; 31 for(i = 0;i <= n;i ++) 32 { 33 for(j = 0;j <= w;j ++) 34 { 35 dis[i][j] = INF; 36 in[i][j] = 0; 37 } 38 } 39 que.push(make_pair(sv,0)); 40 in[sv][0] = 1; 41 dis[sv][0] = 0; 42 while(!que.empty()) 43 { 44 u = que.front().first; 45 num = que.front().second; 46 que.pop(); 47 in[u][num] = 0; 48 if(num + 1 > w) 49 temp = w; 50 else 51 temp = num + 1; 52 for(i = first[u];i != -1;i = edge[i].next) 53 { 54 v = edge[i].v; 55 if(dis[v][temp] > dis[u][num] + edge[i].w) 56 { 57 dis[v][temp] = dis[u][num] + edge[i].w; 58 if(!in[v][temp]) 59 { 60 in[v][temp] = 1; 61 que.push(make_pair(v,temp)); 62 } 63 } 64 } 65 } 66 return dis[ev][w]; 67 } 68 int main() 69 { 70 int i,m,sv,ev,w,temp; 71 while(scanf("%d%d",&n,&m)!=EOF) 72 { 73 CL(); 74 for(i = 0;i < m;i ++) 75 { 76 scanf("%d%d%d",&sv,&ev,&w); 77 add(sv,ev,w); 78 add(ev,sv,w); 79 } 80 scanf("%d%d%d",&sv,&ev,&w); 81 if(w%10 == 0) 82 w = w/10; 83 else 84 w = w/10+1; 85 if((temp = spfa(sv,ev,w)) != INF) 86 printf("%d\n",temp); 87 else 88 printf("-1\n"); 89 } 90 return 0; 91 }