poj3159 Candies SPFA

题目链接:http://poj.org/problem?id=3159

题目很容易理解

就是简单的SPFA算法应用

刚开始用STL里的队列超时了,自己写了个栈,果断过,看来有时候栈还是快啊。。。。

代码:

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cstdio>
 4 #include<cstring>
 5 #define INF 0x3f3f3f3f
 6 #define maxn 30010
 7 #define max_e 150010
 8 using namespace std;
 9 class node
10 {
11    public:
12    int to;
13    int w;
14    int next;
15 };
16 node edge[max_e];
17 int head[maxn];
18 int inq[maxn];
19 int dis[maxn];
20 int tol;
21 int n,m;
22 int Q[maxn];
23 void add(int u,int v,int w)
24 {
25      edge[tol].to=v;
26      edge[tol].w=w;
27      edge[tol].next=head[u];
28      head[u]=tol++;
29 };
30 void SPFA() 
31 {
32      int top=0;
33     for(int i=1;i<=n;i++)
34     {
35         dis[i]=INF;
36         inq[i]=0;
37     }
38     dis[1]=0;
39     inq[1]++;
40     Q[++top]=1;
41     while(top!=0)
42     {
43        int u=Q[top];
44        top--;
45        inq[u]--;
46        int tmp=head[u];
47        while(tmp!=-1)
48        {
49           int v=edge[tmp].to;
50           int w=edge[tmp].w;
51           if(dis[v]>dis[u]+w)
52           {
53               dis[v]=dis[u]+w;
54               if(inq[v]==0) 
55                  {
56                        Q[++top]=v;
57                        inq[v]++;
58                  }
59           }
60            tmp=edge[tmp].next;
61        }
62 
63     }
64 }
65 int main()
66 {
67     int a,b,c;
68   while(scanf("%d%d",&n,&m)!=EOF)
69   {
70        tol=0;
71        memset(head,-1,sizeof(head));
72       for(int i=1;i<=m;i++)
73       {
74         scanf("%d%d%d",&a,&b,&c);
75         add(a,b,c);
76       }
77       SPFA();
78       cout<<dis[n]<<endl;
79   }
80   return 0;
81 }

 

posted on 2013-10-24 18:10  GyyZyp  阅读(124)  评论(0编辑  收藏  举报

导航