【SPFA】POJ3259-Wormhole

普通的SPFA的负环判定。犯了三个错误,全部写在注释里了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 #include<algorithm>
 6 using namespace std;
 7 const int MAXNm=10000+500;
 8 const int MAXNn=500+50;
 9 const int INF=0x7fffffff;
10 int n,m,ww;
11 int u[MAXNm],v[MAXNm],w[MAXNm];
12 int first[MAXNn],next[MAXNm];
13 int dis[MAXNn];
14 void addedge(int tu,int num)
15 {
16     next[num]=first[tu];
17     first[tu]=num;
18 }
19
20 int SPFA()
21 {
22     queue<int> que;
23     int vis[MAXNn],appear[MAXNn];
24     que.push(0);
25     for (int i=0;i<n;i++)
26     {
27         dis[i]=INF;
28         vis[i]=0;
29         appear[i]=0;
30     }
31     /*不要遗漏了上述初始化步骤*/
32     dis[0]=0;
33     vis[0]=1;
34     appear[0]=1;
35
36     while (!que.empty())
37     {
38         int head=que.front();
39         que.pop();
40         vis[head]=0;
41         /*注意这里vis[head]要重归于零!很容易错写成vis[k]=0*/
42         int k=first[head];
43         while (k!=-1)
44         {
45             if (dis[v[k]]>dis[u[k]]+w[k])
46             {
47                 dis[v[k]]=dis[u[k]]+w[k];
48                 if (!vis[v[k]])
49                 /*不要把vis[v[k]]写成vis[k]了*/
50                 {
51                     appear[v[k]]++;
52                     vis[v[k]]=1;
53                     que.push(v[k]);
54                 }
55                 if (appear[v[k]]>=n) return 0;
56             }
57             k=next[k];
58         }
59     }
60     return 1;
61 }
62
63 int main()
64 {
65     int c;
66     scanf("%d",&c);
67     for (int kase=0;kase<c;kase++)
68     {
69         scanf("%d%d%d",&n,&m,&ww);
70         for (int i=0;i<n;i++) first[i]=-1;
71
72         for (int i=0;i<m;i++)
73         {
74             scanf("%d%d%d",&u[i],&v[i],&w[i]);
75             u[i]--;
76             v[i]--;
77             addedge(u[i],i);
78             u[i+m]=v[i];
79             v[i+m]=u[i];
80             w[i+m]=w[i];
81             addedge(u[i+m],i+m);
82         }
83         for (int i=2*m;i<2*m+ww;i++)
84         {
85             scanf("%d%d%d",&u[i],&v[i],&w[i]);
86             u[i]--;
87             v[i]--;
88             w[i]=-w[i];
89             addedge(u[i],i);
90         }
91         if (!SPFA()) cout<<"YES";else cout<<"NO";cout<<endl;
92     }
93
94     return 0;
95 }
时间: 2024-10-07 06:47:34

【SPFA】POJ3259-Wormhole的相关文章

HDU1224 Free DIY Tour 【SPFA】

Free DIY Tour Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3939    Accepted Submission(s): 1262 Problem Description Weiwei is a software engineer of ShiningSoft. He has just excellently fulf

boj 454 帮帮小叮当【SPFA】

题目链接:http://code.bupt.edu.cn/problem/p/454/ 454. 帮帮小叮当 时间限制5000 ms 内存限制 65536 KB 题目描述 小叮当刚刚学会了传送门的使用方法,可是它不小心跌落到二维空间一个 n * m 的矩阵格子世界的入口(1,1)处, 他得知出口在(n,m)处,每穿越一个格子门,它的体力值会下降. 又饿又累的他 IQ 已经降为负数了,聪明的你,能帮他规划一下路线,使得它体力值下降的最少吗? 每一行有且仅有一个传送门,但是小叮当上课睡着了,只学会了

HDU1142 A Walk Through the Forest 【SPFA】+【记忆化搜索】

A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5688    Accepted Submission(s): 2089 Problem Description Jimmy experiences a lot of stress at work these days, especial

POJ 2449 Remmarguts&#39; Date【SPFA】【A*】

Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 21978 Accepted: 5982 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, he to

HDU1217 Arbitrage 【SPFA】

Arbitrage Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4460    Accepted Submission(s): 2032 Problem Description Arbitrage is the use of discrepancies in currency exchange rates to transform

POJ2253&amp;ZOJ1942--Frogger【SPFA】单源最短路变形

链接:http://poj.org/problem?id=2253 题意:一个青蛙在一块石头上,看到了另一个青蛙在另一块石头上,它想跳过去找它,如果距离太远它就需要借助别的石头当跳板,两块石头之间的青蛙距离被定义成两块石头之间所有路径中最大跳跃距离的最小值,求两个青蛙之间的青蛙距离. poj2263和它类似,链接:http://poj.org/problem?id=2263 解题报告:Here 这是最短路的变形,每两点之间都有路可以跳,更新最短路的值,权值记录成目前到这一点的最小青蛙距离就行了

HDU3339 In Action 【SPFA】+【01背包】

In Action Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4099    Accepted Submission(s): 1306 Problem Description Since 1945, when the first nuclear bomb was exploded by the Manhattan Project

【SPFA】POJ1860-Currency Exchange

[题目大意] 给出每两种货币之间交换的手续费和汇率,求出从当前货币s开始交换,能否赚. [思路] 反向运用SPFA,判断是否有正环.每次队首元素出队之后,判断一下到源点s的距离是否增大,增大则返回true.一开始判断正环的思路如果有一个元素入队超过n次,则说明存在正环.后来发现这个思路是不适用的,因为这个正环中并不一定包含源点..要注意的是:题目中的m并不是边数,边数应该是m*2!所以开数组的时候要尤其注意数组不能开小了.由于C++的判定中如果没有崩掉,不会返回RE只会返回WA,我纠结了好久才找

【SPFA】 最短路计数

最短路计数 [问题描述]   给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. [输入格式]   输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边. [输出格式]   输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可.如果无法到达顶点i则输出0. [输入样

【SPFA】POJ1511-Invitation Cards

2题目大意] 给出一张有向图,以1位源点,求“从源点出发到各点的距离”和“与各点返回源点的距离和”相加得到的和. [思路] 毫无疑问是最短路径,但是这数据量就算是SPFA也绝壁会超时啊,抱着必死的心态写了submitt,居然AC..才意识到Time Limit: 8000MS. 大体的实现方法就用SPFA先计算出单源最短路径,接着再把每一条边中起始点和终止点进行对话,把各点返回源点的最短路径转换为单源最短路径,重复操作. SPFA的思路大致如下:先将源点加入队列.对于队列中的队首,对于以它为起始