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 }