POJ3259-Wormholes-( spfa || Bellman_Ford )
题意:有n块田,之间有m条无向边表示路径,权值表示走过需要花费的时间。有w对虫洞,虫洞是单向的,表示穿越一定时间到过去,并且回到虫洞指向的点,问一个人有没有可能通过虫洞回到某个起点,并且在从这个起点出发之前的时间,因为这样可以看到过去的自己。
解题:判断负圈,模板题。
//记录一下模板
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std; int n,m,w;
struct node
{
int to;
int val;
};
vector<node>e[];
int num[];
int d[];
bool vis[]; bool spfa()
{
queue<int>que;
que.push();
d[]=;
vis[]=true;
num[]=;
while( que.size() )
{
int q=que.front();///q是当前结点
que.pop();
vis[q]=false;
int len=e[q].size();
for(int i=;i<len;i++)
{
int next=e[q][i].to;
int cost=e[q][i].val;
if( d[next] > d[q]+cost )
{
d[next]=d[q]+cost;
if( !vis[next] )///没有入队
{
num[next]++;
if( num[next]>=n )
return false;///入了这么多次,存在负圈
vis[next]=true;///入队标记
que.push(next);
} }
}
}
return true;
} int main()
{
int t;
scanf("%d",&t);
while(t--)
{ scanf("%d%d%d",&n,&m,&w);///点、边、负边
memset(d,inf,sizeof(d));
memset(num,,sizeof(num));
memset(vis,false,sizeof(vis));
for(int i=;i<=n;i++)
e[i].clear(); ///正边+负边总数
int a,b,c;
for(int i=;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);///起点,终点,权值
e[a].push_back({b,c});
e[b].push_back({a,c});
}
for(int i=;i<w;i++)
{
scanf("%d%d%d",&a,&b,&c);
e[a].push_back({b,-c}); }
if( spfa() )
printf("NO\n");
else
printf("YES\n"); }
return ;
}
spfa模板
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std; struct edge
{
int from;
int to;
int val;
};
edge e[];///无向边*2+有向边
int d[];///各个点到起点的距离
int n,m,w,cnt;
int a,b,c; void add(int x,int y,int z)
{
e[cnt].from=x;
e[cnt].to=y;
e[cnt].val=z;
cnt++;
} bool Bellman_Ford()//贝尔曼福特
{
d[]=;///把1作为起点
for(int i=;i<n;i++)
{
for(int j=;j<cnt;j++)
{
if( d[ e[j].from ] > d[ e[j].to ] + e[j].val )
d[ e[j].from ] = d[ e[j].to ] + e[j].val;
}
}
for(int j=;j<cnt;j++)///第n+1次,还能对边松弛则说明存在负环
{
if( d[ e[j].from ] > d[ e[j].to ] + e[j].val )
return false;
}
return true;
} int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(d,inf,sizeof(d));
scanf("%d%d%d",&n,&m,&w);///点、边、负边
cnt=;///正边+负边的总边数
for(int i=;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);///无向边
}
for(int i=;i<w;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,-c);
}
if( Bellman_Ford() )
printf("NO\n");
else
printf("YES\n"); }
return ;
}
Bellman_Ford模板
POJ3259-Wormholes-( spfa || Bellman_Ford )的更多相关文章
- POJ3259 :Wormholes(SPFA判负环)
POJ3259 :Wormholes 时间限制:2000MS 内存限制:65536KByte 64位IO格式:%I64d & %I64u 描述 While exploring his many ...
- POJ3259 Wormholes(SPFA判断负环)
Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes ...
- POJ3259 Wormholes —— spfa求负环
题目链接:http://poj.org/problem?id=3259 Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submis ...
- [poj3259]Wormholes(spfa判负环)
题意:有向图判负环. 解题关键:spfa算法+hash判负圈. spfa判断负环:若一个点入队次数大于节点数,则存在负环. 两点间如果有最短路,那么每个结点最多经过一次,这条路不超过$n-1$条边. ...
- poj3259 Wormholes【Bellman-Ford或 SPFA判断是否有负环 】
题目链接:poj3259 Wormholes 题意:虫洞问题,有n个点,m条边为双向,还有w个虫洞(虫洞为单向,并且通过时间为倒流,即为负数),问你从任意某点走,能否穿越到之前. 贴个SPFA代码: ...
- POJ3259 Wormholes 【spfa判负环】
题目链接:http://poj.org/problem?id=3259 Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submis ...
- POJ3259——Wormholes(Bellman-Ford+SPFA)
Wormholes DescriptionWhile exploring his many farms, Farmer John has discovered a number of amazing ...
- POJ--3259 Wormholes (SPFA判负环)
题目电波 3259 Wormholes #include<iostream> #include<cstring> #include<algorithm> #in ...
- poj3259 Wormholes (判负环)【spfa】(模板)
<题目链接> 题目大意: John的农场里N块地,M条路连接两块地,W个虫洞,虫洞是一条单向路,会在你离开之前把你传送到目的地,就是当你过去的时候时间会倒退Ts.我们的任务是知道会不会在从 ...
- poj-3259 Wormholes(无向、负权、最短路之负环判断)
http://poj.org/problem?id=3259 Description While exploring his many farms, Farmer John has discovere ...
随机推荐
- Hystrix实现ThreadLocal上下文的传递 转
springcloud微服务中, 服务间传输全局类参数,如session信息等. 一.问题背景 Hystrix有2个隔离策略:THREAD以及SEMAPHORE,当隔离策略为 THREAD 时,是没办 ...
- Lua函数声明与调用
lua编程中,我们经常也会遇到函数的声明定义和调用. [1]lua中函数定义与调用的方法 lua有两种函数定义和调用的方法(本质都是用属性,方式不同而已): (1)点号形式 (2)冒号形式 两种方法的 ...
- LaTeX 小试牛刀
跟大家分享一下正式第一次使用 LaTex 的经验,之前数学建模的时候一直想用,但没有找到合适的软件.前段时间,实验室老师让我帮忙套个 IEEE ACCESS 的模板. 尝试过 TexPad,的确 UI ...
- .netcore docker noe4j
1.借用docker搭建noe4j环境 docker pull neo4j docker run -d --restart=always -p7474: -p7687: -v /root/docker ...
- .NET CORE 中的缓存使用
Net Framewoke的缓存 1.1 System.Web.Caching System.Web.Caching应该是我们最熟悉的缓存类库了,做ASP.NET开发时用到缓存基本都是使用的这个缓存组 ...
- Django ORM 数据库增删改查
Django ORM 数据库增删改查 增 # 创建.增加数据(推荐) models.UserInfo.objects.create(username=') # 创建.增加数据 dic = {'} mo ...
- 【题解】Luogu P4284 [SHOI2014]概率充电器
原题传送门 我们知道,每个电器充电对充电电器数的贡献都是相等的1,所以若第\(i\)个电器有\(p_i\)的概率充电时 \[E=\sum_{i=1}^np_i\] 我们考虑如何求\(p_i\),根据树 ...
- Java学习:接口(interface)的使用于注意事项
接口 接口就是一种公共的规范标准.只要符合规范标准,就可以大家通用. 接口就是多个类的公共规范.接口是一种引用数据类型,最重要的内容就是其中的:抽象方法. 如何定义一个接口的格式 如何定义一个接口的格 ...
- ClassPathBeanDefinitionScanner 说明
Spring 工具类 ClassPathBeanDefinitionScanner 组件Bean定义扫描https://blog.csdn.net/andy_zhang2007/article/det ...
- ModbusTCP协议
简介 Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准.1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP. Modbus协议是一项应用层 ...