版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/,未经本作者同意不得转载。 https://blog.csdn.net/kenden23/article/details/37738183

本题事实上也能够使用SPFA算法来求解的,只是就一个关键点,就是当某个顶点入列的次数超过全部顶点的总数的时候,就能够推断是有负环出现了。

SPFA原来也是能够处理负环的。

只是SPFA这样的处理负环的方法自然比一般的Bellman Ford算法要慢点了。

#include <stdio.h>
#include <string.h>
#include <limits.h> const int MAX_N = 501;
const int MAX_M = 2501;
const int MAX_W = 201; struct Edge
{
int src, des, wei, next;
//Edge(int s, int d, int w) : src(s), des(d), wei(w) {}
}; Edge edge[(MAX_M<<1)+MAX_W];
int dist[MAX_N];
int head[MAX_N];
bool vis[MAX_N];
int qu[MAX_N];
int cnt[MAX_N];
int totalEdges; inline void insertEdge(int src, int des, int wei)
{
edge[totalEdges].src = src, edge[totalEdges].des = des;
edge[totalEdges].wei = wei; edge[totalEdges].next = head[src];
head[src] = totalEdges++;
} int N, M, W, F; bool cycleSPFA()
{
for (int i = 1; i <= N; i++) dist[i] = INT_MAX;
dist[1] = 0; memset(vis, 0, sizeof(bool)*(N+1));
memset(cnt, 0, sizeof(int)*(N+1));
int top = 0, tail = 1; //循环队列的头和尾下标
qu[top] = 1;
vis[1] = true;
cnt[1] = 1;
while (top < tail)
{
int u = qu[top%MAX_N]; //自己定义循环队列
top++;
vis[u] = false; for (int e = head[u]; e ; e = edge[e].next)
{
int v = edge[e].des;
if (dist[u]+edge[e].wei < dist[v])
{
dist[v] = dist[u]+edge[e].wei;
if (!vis[v])
{
vis[v] = true;
qu[tail%MAX_N] = v;
tail++;
cnt[v]++; //记录入列次数
if (cnt[v] >= N) return true;
}
}
}
}
return false;
} int main()
{
int src, des, wei;
scanf("%d", &F);
while (F--)
{
scanf("%d %d %d", &N, &M, &W);
memset(head, 0, sizeof(int) * (N+1));
totalEdges = 1;
for (int i = 0; i < M; i++)
{
scanf("%d %d %d", &src, &des, &wei);
insertEdge(src, des, wei);
insertEdge(des, src, wei);
}
for (int i = 0; i < W; i++)
{
scanf("%d %d %d", &src, &des, &wei);
insertEdge(src, des, -wei);
}
if (cycleSPFA()) puts("YES");
else puts("NO");
}
return 0;
}

POJ 3259 Wormholes SPFA算法题解的更多相关文章

  1. poj 3259 Wormholes spfa算法

    点击打开链接 Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25582   Accepted: 9186 ...

  2. ACM: POJ 3259 Wormholes - SPFA负环判定

     POJ 3259 Wormholes Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu   ...

  3. poj - 3259 Wormholes (bellman-ford算法求最短路)

    http://poj.org/problem?id=3259 农夫john发现了一些虫洞,虫洞是一种在你到达虫洞之前把你送回目的地的一种方式,FJ的每个农场,由n块土地(编号为1-n),M 条路,和W ...

  4. POJ 3259 Wormholes(SPFA判负环)

    题目链接:http://poj.org/problem?id=3259 题目大意是给你n个点,m条双向边,w条负权单向边.问你是否有负环(虫洞). 这个就是spfa判负环的模版题,中间的cnt数组就是 ...

  5. POJ 3259 Wormholes ( SPFA判断负环 && 思维 )

    题意 : 给出 N 个点,以及 M 条双向路,每一条路的权值代表你在这条路上到达终点需要那么时间,接下来给出 W 个虫洞,虫洞给出的形式为 A B C 代表能将你从 A 送到 B 点,并且回到 C 个 ...

  6. 最短路(Bellman_Ford) POJ 3259 Wormholes

    题目传送门 /* 题意:一张有双方向连通和单方向连通的图,单方向的是负权值,问是否能回到过去(权值和为负) Bellman_Ford:循环n-1次松弛操作,再判断是否存在负权回路(因为如果有会一直减下 ...

  7. POJ 3259 Wormholes(最短路径,求负环)

    POJ 3259 Wormholes(最短路径,求负环) Description While exploring his many farms, Farmer John has discovered ...

  8. POJ 3259 Wormholes (Bellman_ford算法)

    题目链接:http://poj.org/problem?id=3259 Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submis ...

  9. POJ 3259 Wormholes(SPFA)

    http://poj.org/problem?id=3259 题意 : 农夫约翰农场里发现了很多虫洞,他是个超级冒险迷,想利用虫洞回到过去,看再回来的时候能不能看到没有离开之前的自己,农场里有N块地, ...

随机推荐

  1. windows下 申请免费ssl证书的方法 (letsencrypt)

    Let's Encrypt,官网是https://letsencrypt.org/,它是一个由各大公司赞助的公益组织: 有趋势有需求,自然也有免费可用.免费的SSL证书中,首推就是Let's Encr ...

  2. Charles模拟数据

    安装好Charles 桌面创建json文件

  3. 苹果cms v10官网下载

    苹果CMS程序是一套采用PHP+MYSQL环境下运行的完善而强大的快速建站系统.经过近多年的开发经验和技术积累,苹果CMS程序已逐步走向成熟,在易用性和功能上已经成为同行中的佼佼者.程序体积小-> ...

  4. Java字符串的不可变性

    声明一个字符串引用变量: String  s = "abcd"; s是一个引用变量,指向 堆内存中的字符串常量 "abcd" 再声明一个字符串引用变量: Str ...

  5. git连接远程仓库时,出现“ Repository not found"的解决办法

    2018-08-25 今天连接远程仓库时,出现: 原来是远程仓库地址名字错了. 解决方法: 1.找到.git目录 2.进入.git找到config文件 3.修改config里面的远程地址url

  6. 打开远程桌面时总提示无法打开连接文件default.rdp

    删除C:\Users\Administrator\Documents\default.rdp,再启动远程就好了 http://www.chahushequ.com/read-topic-94-2fa9 ...

  7. 利用Eclipse CDT 阅读C/C++代码

    本文转自: https://xbgd.iteye.com/blog/1259544 常见阅读代码的工具有 , visual c++, visual studio + va(visual assista ...

  8. IDEA集成Tomcat启动控制台乱码

    解决方法: 在下图位置加上: -Dfile.encoding=UTF-8 然后安装下图设置: 如果上述方法重启tomcat还是乱码,那么: 进入idea的安装目录, 进入bin目录下.找到idea.e ...

  9. Promise【其他模式】

    Promise @Slf4j public class Promise { /** * Promise Pattern[承诺]:承诺表示当前还未完成,但是会在将来完成的操作,用于实现异步计算. */ ...

  10. 安装 Windows 系统在 NVMe 规范的 M.2 接口的固态硬盘(SSD)上

    作为一个程序员很重要的一项技能就是装系统 @_@,以前我都是随便用网上的工具做个系统盘,每次要用直接随手就搞好了,节省大家时间. 但最近同事装了个贼小的固态,然后我启动盘里的系统果断识别不出来他的固态 ...