虫洞(wormhole)

FJ 在农场上闲逛时,发现他的农场里有很多虫洞。虫洞是一条特殊的有向路径,当

FJ 从它的一头走到另一头后,他将被传送到过去的某个时刻。FJ 的每个农场包括

N(1<=N<=500)块按1..N 编号的草地、M(1<=M<=2500)条草地间的道路以及W(1<=W<=200)

个虫洞。

FJ 一直以来就渴望进行时间旅行,于是他开始做如下的打算:从某块草地出发,穿

过一些道路以及一些虫洞,最终回到他出发的草地。这样,他说不定能碰见过去的自

己:) 。

请你帮FJ 算一下,他是否可能找到这样的一条路。当然,FJ 会给你他的所有

F(1<=F<=5)个农场的完整的地图。没有哪条道路上需要花的时间超过10,000 秒,同时,

也没有哪个虫洞能把FJ 带回10,000 秒以前。

程序名: wormhole

输入格式:

  • 第1 行: 一个正整数F,即农场总数。以下依次描述各个农场的地图

  • 每个农场描述的第1 行:三个用空格隔开的整数,N、M 和W

  • 每个农场描述的第2..M+1 行:每行包含三个用空格隔开的整数S、E、T,表示

编号为S 的草地和编号为E 的草地边有一条双向道路,通过它所花费的时间为T 秒。两

块草地间可能有多条道路

  • 每个农场描述的第M+2..M+W+1 行:每行包含三个用空格隔开的整数S、E、T,

描述了一个起点编号为S、终点编号为E 的虫洞。穿过这个虫洞后,FJ 可以回到T 秒之

前 输入样例(wormhole.in):

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

输入说明:

FJ 交给你两个农场的地图。第一个农场里有三条道路以及一个虫洞,第二个农场里

有两条道路和一个虫洞。

输出格式:

  • 第1..F 行: 对于每个农场,如果FJ 可以实现他回到过去的愿望,输出"YES",

否则输出"NO"(不含引号)。

输出样例(wormhole.out):

NO
YES

输出说明:

在农场1 中,FJ 无法完成他期望的时间旅行。

在农场2 中,FJ 可以沿路线1->2->3->1 旅行,这样他能在离开1 号草地前一秒回

到1 号草地。当然,从这条路线上的其他草地出发,也能达到目的。

这道题简单来说就是判断图内是否存在负环;

判断负环方法:拓扑排序或spfa

spfa判断负环:如果任意一条边被修改大于n次,就代表这个图内一定存在至少一个负环。

 #include<bits/stdc++.h>
using namespace std;
#define man 1000010
#define ll int
struct edge
{
int next,dis,to;
}e[man<<];
ll head[man<<],num=,cnt[man<<];
bool vis[man];
ll dis[man<<],t,n,m,w;
inline void add(ll from,ll to,ll dis)
{
e[++num].next=head[from];
e[num].to=to;
e[num].dis=dis;
head[from]=num;
}
inline void clear()
{
memset(head,,sizeof(head));
memset(e,,sizeof(e));
memset(cnt,,sizeof(cnt));
num=;
}
inline bool spfa(ll s)
{
memset(vis,,sizeof(vis));
memset(dis,0x7f,sizeof(dis));
queue<int >q;
q.push(s);dis[s]=;vis[s]=;
do
{
int u=q.front();q.pop();
vis[u]=;
for(int i=head[u];i;i=e[i].next)
{
ll to=e[i].to;
if(dis[to]>dis[u]+e[i].dis)
{ dis[to]=dis[u]+e[i].dis;
if(!vis[to])
{
q.push(to);
vis[to]=;
cnt[to]++;
}
if(cnt[to]>n) return ;
}
}
}while(q.size());
return ;
}
int main()
{
ios::sync_with_stdio(false);
cin>>t;
while(t--)
{
clear();
cin>>n>>m>>w;
for(int i=,x,y,z;i<=m;i++)
{ cin>>x>>y>>z;
add(x,y,z);add(y,x,z);
}
for(int i=,x,y,z;i<=w;i++)
{ cin>>x>>y>>z;
add(x,y,-z);
}
if(spfa()==) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return ;
}

拓扑排序:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int t,n,m,w,x,y,z,num=,dis[];
bool flag;
struct star{
int from,to,dis;
}e[];
void add(int from, int to, int dis){
e[++num].from=from;
e[num].to=to;
e[num].dis=dis;
}
bool topsort(){
memset(dis,0x7f,sizeof(dis));
dis[]=;
for(int i=;i<=n;i++){
flag=;
for(int j=;j<=num;j++)
if(dis[e[j].to]>dis[e[j].from]+e[j].dis){
flag=;
dis[e[j].to]=dis[e[j].from]+e[j].dis;
}
if(!flag)return ;
}
return ;
}
int main(){
scanf("%d",&t);
for(int i=;i<=t;i++){
num=;
scanf("%d%d%d",&n,&m,&w);
for(int j=;j<=m;j++){
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}
for(int j=;j<=w;j++){
scanf("%d%d%d",&x,&y,&z);
add(x,y,-z);
}
if(topsort())printf("YES\n");
else printf("NO\n");
}
return ;
}

洛谷 P2850 [USACO06DEC]虫洞Wormholes 判负环的更多相关文章

  1. 洛谷 P2850 [USACO06DEC]虫洞Wormholes 题解

    P2850 [USACO06DEC]虫洞Wormholes 题目描述 While exploring his many farms, Farmer John has discovered a numb ...

  2. poj3259 Wormholes (判负环)【spfa】(模板)

    <题目链接> 题目大意: John的农场里N块地,M条路连接两块地,W个虫洞,虫洞是一条单向路,会在你离开之前把你传送到目的地,就是当你过去的时候时间会倒退Ts.我们的任务是知道会不会在从 ...

  3. 题解【洛谷P3385】【模板】负环

    题目描述 暴力枚举/\(SPFA\)/\(Bellman-ford\)/奇怪的贪心/超神搜索 寻找一个从顶点1所能到达的负环,负环定义为:一个边权之和为负的环. 输入输出格式 输入格式 第一行一个正整 ...

  4. [P2850][USACO06DEC]虫洞Wormholes (最短路)

    死活调不出来 后来是发现这题建边的原因…… 吐血.jpg 所谓的虫洞传说也就是负边了 然后这里打的spfa和原来的不一样 感觉hzwer大佬的spfa好强啊…… 也更易写一点 贴代码 #include ...

  5. 浅谈SPFA判负环

    目录 SPFA判负环 [前言] [不可代替性] [具体实现] SPFA的过程 判负环 [核心代码] [例题] SPFA判负环 有不足的地方请指出 本蒟蒻一定会修改吼 [前言] 最短路的求法中最广为人知 ...

  6. BZOJ 1715: [Usaco2006 Dec]Wormholes 虫洞 DFS版SPFA判负环

    Description John在他的农场中闲逛时发现了许多虫洞.虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前).John的每个农场有M条小路(无向边)连接着N ...

  7. bzoj 1715: [Usaco2006 Dec]Wormholes 虫洞【spfa判负环】

    tag是假的,用了及其诡异的方法判负环 正权无向边和负权有向边的图 #include<iostream> #include<cstdio> #include<cstrin ...

  8. Poj 3259 Wormholes(spfa判负环)

    Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 42366 Accepted: 15560 传送门 Descr ...

  9. POJ3259 Wormholes 【spfa判负环】

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

随机推荐

  1. Unit01: JDBC原理 、 JDBC基础编程

    Unit01: JDBC原理 . JDBC基础编程 这个文件里面有两块内容: 1.用比较麻烦的方式连接数据库,test1(),test4() 2.创建DBTool,测试DBTool连接数据库 ,tes ...

  2. js 日期正则 转载

    天秤水的Blog 博客园 博问 闪存 首页 新随笔 联系 管理 订阅 随笔- 70  文章- 0  评论- 74    最强日期正则表达式   一.简单的日期判断(YYYY/MM/DD):  ^\d{ ...

  3. 你一定想知道的关于FPGA的那些事

    首先,如果您从未接触过FPGA(现场可编程门阵列),或者有过一点基础想要继续深入了解这个行业,在这里,会向您介绍FPGA,并且向您解释FPGA都能解决什么问题,如何解决这些问题,并讨论如何将设计进行优 ...

  4. python set集合 以及 深浅拷贝

    set集合 特点: 无序, 不重复, 元素必须可哈希(不可变) 作用: 去重复 本身是可变的数据类型. 有增删改查操作. frozenset()冻结的集合. 不可变的. 可hash的 深浅拷贝() 1 ...

  5. 小峰Hibernate简介与HelloWorld

    一.Hibernate简介: 二.Hibernate4 版Hello World 实现 工程结构: com.cy.model.Student: package com.cy.model; public ...

  6. 导入和导出eclipse代码格式化模板

    导入和导出eclipse代码格式化模板 导出格式化代码模板:

  7. sys模块的问题,深浅COPY的应用场景,元祖与购物车程序练习-打印彩色\033[31;1m--------\033[0m

    打印彩色:%s为变量,格式化 print("Added %s into shopping cart,your current balance is \033[31;1m%s\033[0m&q ...

  8. Wdatepicker日期控件的使用指南

    示例2-3-1 起始日期简单应用 示例2-3-2 alwaysUseStartDate属性应用 示例2-3-3 使用内置参数 示例 2-4-1: 年月日时分秒 示例 2-4-2 时分秒 示例 2-4- ...

  9. 运维平台cmdb开发-day3

    后台管理 1. 访问过程 我们在前面2天得到了各个客户端的资产数据信息,我们将各个这个数据打包发送到api,这个api其实就是django的url传参,之后按照数据的格式对比数据库增删改 2. 后台页 ...

  10. 解决easyui jQuery JS的for循环调用ajax异步问题

    由于JS的for循环与ajax非同步运行,因此导致for循环结束了而ajax却还未执行,解决此方法有两种 1.设置ajax参数async为false,即与js同步,默认是true(异步). 这里首先引 ...