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 }

 

posted @ 2013-05-06 20:44  Naix_x  阅读(163)  评论(0编辑  收藏  举报