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 }

 

转载于:https://www.cnblogs.com/xiaozhuyang/p/poj3159.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值