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 }

 

你可能感兴趣的:(require)