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 ...
随机推荐
- 算法:array1和array2地址值相同,都指向堆空间的唯一的一个数组实体(不是数组的复制)
package com.atguigu; public class fuzhi { public static void main(String[] args) { int[] array1=new ...
- Laravel学习记录
1. stream 下载响应 response()->streamDownload(function (){ echo "test" // 输出 },'文件名');
- 14. Scala使用递归的方式去思考,去编程
14.1 基本介绍 -Scala饰运行在Java虚拟机(Java Virtual Machine)之上,因此具有如下特点 1) 轻松实现和丰富的Java类库互联互通 2) 它既支持面向对象的编程方式, ...
- js 数组sort, 多条件排序。
Array.sort(); sort()方法可以传入一个函数作为参数,然后依据该函数的逻辑,进行数组的排序. 一般用法:(数组元素从小大进行排序) var a = [9, 6, 5, 7, 11, 5 ...
- Flink基本的API
Flink使用 DataSet 和 DataStream 代表数据集.DateSet 用于批处理,代表数据是有限的:而 DataStream 用于流数据,代表数据是无界的.数据集中的数据是不可以变的, ...
- Microsoft SQL Server数据库语法
目录 关于数据库的语法: 1.创建数据库 create database 数据库名on primary(主文件属性(name,filename,size等)) -用逗号隔开次要主要文件和次要文件( ...
- Java 面向对象(八) 权限修饰符 和 final、native 关键字
一.权限修饰符 1.概述 在 Java 中提供了四种访问权限,使用不同的访问权限修饰符修饰时,被修饰的内容会有不同的访问权限: public:公共的: protected:受保护的: default: ...
- FFMPEG处理音频时间戳的主要逻辑
来源:http://www.xuebuyuan.com/1466771.html FFMPEG处理音频时间戳的主要逻辑 2013年12月09日 ⁄ 综合 ⁄ 共 2226字 ⁄ 字号 小 中 大 ⁄ ...
- JS 正则表达式转换字符串
获取第一个.前面的字符串,以及后面的字符串: const transform = str => { str.replace(/([^\.]*)\.(.*)/, function($0, $1,$ ...
- fiddler模拟弱网测试
1.首先设置手机代理 设置手机代理到本机ip,端口号8888(Fiddler默认设置): 手机访问http://ip:port安装Fiddler证书 2.修改fiddler配置 勾选上后,已经开始限速 ...