Wormholes POJ 3259(SPFA判负环)
Description
While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a time that is BEFORE you entered the wormhole! Each of FJ's farms comprises N (1 ≤ N ≤ 500) fields conveniently numbered 1..N, M (1 ≤ M ≤ 2500) paths, and W (1 ≤ W ≤ 200) wormholes.
As FJ is an avid time-traveling fan, he wants to do the following: start at some field, travel through some paths and wormholes, and return to the starting field a time before his initial departure. Perhaps he will be able to meet himself :) .
To help FJ find out whether this is possible or not, he will supply you with complete maps to F (1 ≤ F ≤ 5) of his farms. No paths will take longer than 10,000 seconds to travel and no wormhole can bring FJ back in time by more than 10,000 seconds.
Input
Output
Sample Input
2
3 3 1
1 2 2
1 3 4
2 3 1
3 1 3
3 2 1
1 2 3
2 3 4
3 1 8
Sample Output
NO
YES
Hint
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define INF 0x3f3f3f3f
#define maxs 10010
using namespace std;
struct node
{
int to;
int w;
} t;
vector<node>Map[maxs];
int dis[maxs];
int vis[maxs];
int n,m,k;
void add(int s,int e,int w)
{
t.to=e;
t.w=w;
Map[s].push_back(t);
}
void init()
{
int i;
memset(dis,INF,sizeof(dis));
memset(vis,,sizeof(vis));
for(i=; i<=n; i++)
{
Map[i].clear();
}
}
int SPFA(int s)
{
int cnt[maxs]= {};///记录每个点入队次数
int i;
dis[s]=;
vis[s]=;
queue<int>q;
q.push(s);
cnt[s]++;
while(!q.empty())
{
int u=q.front();
/*if(cnt[u]>=n)
{
return 0;///这里用来判断入队列是否超过N次
}*/
q.pop();
vis[u]=;
for(i=; i<Map[u].size(); i++)
{
int to=Map[u][i].to;
if(dis[to]>dis[u]+Map[u][i].w)
{
dis[to]=dis[u]+Map[u][i].w;///松弛操作
if(dis[]<)///这种判断是否有负环的更快。如果起始点的dis[s]<0说明存在负环
{
return ;
}
if(!vis[to])
{
vis[to]=;
q.push(to);
cnt[to]++;
}
}
}
}
return ;
}
int main()
{
int t,i,j,u,v,w;
scanf("%d",&t);
for(i=; i<=t; i++)
{
scanf("%d%d%d",&n,&m,&k);
init();
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
while(k--)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,-w);///虫洞时间取负值
}
if(SPFA())
{
printf("NO\n");
}
else
{
printf("YES\n");
}
}
return ;
}
这里再附上使用邻接矩阵和Bellman-Ford算法的代码。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
struct Edge
{
int f;///起点
int t;///终点
int c;///距离
} edge[];
int dist[];
int n,m,h,cnt;
int bellman_ford()
{
memset(dist,inf,sizeof(dist));
dist[]=;///起点
int i,j;
for(j=; j<=n; j++)
{
for(i=; i<=cnt; i++)
{
if(dist[edge[i].t]>dist[edge[i].f]+edge[i].c)///松弛操作
{
dist[edge[i].t]=dist[edge[i].f]+edge[i].c;
}
}
}
int flag=;
for(i=; i<=cnt; i++)///遍历所有的边
{
if(dist[edge[i].t]>dist[edge[i].f]+edge[i].c)
{
flag=;///存在从源点可达的负权回路
break;
}
}
return flag;
}
int main()
{
int i,t;
scanf("%d",&t);
while(t--)
{
cnt=;
scanf("%d %d %d",&n,&m,&h);
int u,v,w;
for(i=; i<=m; i++)
{
cnt++;
scanf("%d %d %d",&u,&v,&w);
edge[cnt].f=u;
edge[cnt].t=v;
edge[cnt].c=w;
cnt++;
edge[cnt].f=v;
edge[cnt].t=u;
edge[cnt].c=w;
}
for(i=; i<=h; i++)
{
cnt++;
scanf("%d %d %d",&u,&v,&w);
edge[cnt].f=u;
edge[cnt].t=v;
edge[cnt].c=-w;
}
if(bellman_ford())
printf("NO\n");
else
printf("YES\n");
}
return ;
}
Wormholes POJ 3259(SPFA判负环)的更多相关文章
- Wormholes POJ - 3259 spfa判断负环
//判断负环 dist初始化为正无穷 //正环 负无穷 #include<iostream> #include<cstring> #include<queue> # ...
- bzoj 1715: [Usaco2006 Dec]Wormholes 虫洞【spfa判负环】
tag是假的,用了及其诡异的方法判负环 正权无向边和负权有向边的图 #include<iostream> #include<cstdio> #include<cstrin ...
- POJ - 3851-Wormholes(SPFA判负环)
A friend of yours, an inventor, has built a spaceship recently and wants to explore space with it. D ...
- POJ 3259 Wormholes(SPFA判负环)
题目链接:http://poj.org/problem?id=3259 题目大意是给你n个点,m条双向边,w条负权单向边.问你是否有负环(虫洞). 这个就是spfa判负环的模版题,中间的cnt数组就是 ...
- Poj 3259 Wormholes(spfa判负环)
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 42366 Accepted: 15560 传送门 Descr ...
- poj 2049(二分+spfa判负环)
poj 2049(二分+spfa判负环) 给你一堆字符串,若字符串x的后两个字符和y的前两个字符相连,那么x可向y连边.问字符串环的平均最小值是多少.1 ≤ n ≤ 100000,有多组数据. 首先根 ...
- poj 1364 King(线性差分约束+超级源点+spfa判负环)
King Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14791 Accepted: 5226 Description ...
- BZOJ 1715: [Usaco2006 Dec]Wormholes 虫洞 DFS版SPFA判负环
Description John在他的农场中闲逛时发现了许多虫洞.虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前).John的每个农场有M条小路(无向边)连接着N ...
- spfa判负环
bfs版spfa void spfa(){ queue<int> q; ;i<=n;i++) dis[i]=inf; q.push();dis[]=;vis[]=; while(!q ...
- 2018.09.24 bzoj1486: [HNOI2009]最小圈(01分数规划+spfa判负环)
传送门 答案只保留了6位小数WA了两次233. 这就是一个简单的01分数规划. 直接二分答案,根据图中有没有负环存在进行调整. 注意二分边界. 另外dfs版spfa判负环真心快很多. 代码: #inc ...
随机推荐
- Redis(一):NoSQL入门和概述
NoSQL入门和概述目录导航: NoSQL入门概述 3V+3高 当下的NoSQL经典应用 NoSQL数据模型简介 NoSQL数据库的四大分类 在分布式数据库中CAP原理CAP+BASE NoSQL 入 ...
- 使用CURL实现GET和POST方式请求
/** 使用curl方式实现get或post请求@param $url 请求的url地址@param $data 发送的post数据 如果为空则为get方式请求return 请求后获取到的数据 */f ...
- 搜索引擎的选择与在chrome上的设置
1 优缺点分析 百度:广告多,但是电脑端可以用Adblock Plus屏蔽:搜索内容有很多百度自家内容,如百家号.百度知道.百度文库.百度贴吧等,在搜索教程的时候很实用,但是不适合偏专业性搜索,很多 ...
- java入门---循环结构 - for, while 及 do...while&break&continue
顺序结构的程序语句只能被执行一次.如果您想要同样的操作执行多次,,就需要使用循环结构.Java中有三种主要的循环结构: while 循环 do…while 循环 for 循环 在Jav ...
- Oracle入门第四天(下)——约束
一.概述 1.分类 表级约束主要分为以下几种: NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHECK 2.注意事项 如果不指定约束名 ,Oracle server ...
- shiro实战整合
引入依赖(包括缓存等): <!-- SECURITY begin --> <dependency> <groupId>org.apache.shiro</gr ...
- 20155203 2016-2017-2 《Java程序设计》第10周学习总结
20155203 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 网络编程(Java Socket编程) Java最初是作为网络编程语言出现的,其对网络提供 ...
- 20155325 2016-2017-2 《Java程序设计》第3周学习总结
教材学习内容总结 别用==直接比较浮点数运算结果. Integer默认值-128到127,若超出,需要修改系统属性,所以最好通过equals()比较. 系统错误提示:若超出数组范围,则显示ArrayI ...
- [2016北京集训测试赛3]masodik-[凸包]
Description Soluton 666这道题竟然用凸包... 维护r和c的下凸壳.哪个斜率大走哪个. 证明:我们先不考虑其他的,只考虑两条路,如下图: 设图的长度为x,宽度为y.如果我们要走上 ...
- 【NOIP2018pj】题解
[NOIP2018pj]题解 \(T1\) 题面 洛谷 题解 好像并没有什么好说的... #include <iostream> #include <cstdio> #incl ...