版权声明:本文作者靖心,靖空间地址: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. Linux系统安装时分区的介绍

    一般来说,在linux系统中都有最少两个挂载点,分别是/ (根目录)及 swap(交换分区),其中,/ 是必须的: 建议挂载的几大目录: /-------根目录,唯一必须挂载的目录.不要有任何的犹豫, ...

  2. eclipse代码自动补全设置

    1.说明 eclipse安装好了之后,在编辑框中输入某个英文字符,默认不自动弹出自动代码选择框,需要手动按下 Alt + / 或者输入的字符为 .  才弹出代码自动补全框.其实eclipse是可以设置 ...

  3. Mongodb分片副本集集群搭建

    一.环境准备 1.1.主机信息(机器配置要求见硬件及开发标准规范文档V1.0) 序号 主机名 IP 1 DB_01 10.202.105.52 2 DB_02 10.202.105.53 3 DB_0 ...

  4. python双划线类型

    通过__开始的属性感觉分为两种类型: 利用dir调用的时候: < build in x object at 0x01F116B0>:这种貌似和运算符重载有关系,用户如果需要的话可以重写该函 ...

  5. swagger2简单使用

    1.引入jar <!--引入swagger--> <dependency> <groupId>io.springfox</groupId> <ar ...

  6. tp3.2 页面Windows正常 linux异常,页面找不到

    这个问题主要是tp3.2 在读取控制器里的方法时,会把方法自动转为小写, 然后去对应view成找html文件,自然找不到. class textController extends ComContro ...

  7. 微信小程序 导航(a 连接)自定义组件

    导航:navigator 组件 组件上的属性: target:跳到其他小程序( 默认是当前小程序 ),当属性值为 miniProgram 时,跳到别的小程序(如果要跳到别的小程序,需要填写 appid ...

  8. k8s网络通信

    K8s有三种网络, 1.节点网络 2.pod网络 3.service集群网络,由kube-proxy来负责

  9. leetcode 240搜索二维矩阵

    /** 正常的二维搜索估计要超时,本题沿着对角线搜索,然后找到第一个大于目标数字的坐标(x,y)然后搜索(>x,<y)(<x,>y)子区域: 矩阵size() 为m,n:当i& ...

  10. python - 标准库:subprocess模块

    subprocess的目的就是启动一个新的进程并且与之通信. subprocess模块中只定义了一个类: Popen. subprocess.Popen(args, bufsize=0, execut ...