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 }

 

posted @ 2012-08-25 20:08  _雨  阅读(217)  评论(0编辑  收藏  举报