题意:有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 )的更多相关文章

  1. POJ3259 :Wormholes(SPFA判负环)

    POJ3259 :Wormholes 时间限制:2000MS 内存限制:65536KByte 64位IO格式:%I64d & %I64u 描述 While exploring his many ...

  2. POJ3259 Wormholes(SPFA判断负环)

    Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes ...

  3. POJ3259 Wormholes —— spfa求负环

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

  4. [poj3259]Wormholes(spfa判负环)

    题意:有向图判负环. 解题关键:spfa算法+hash判负圈. spfa判断负环:若一个点入队次数大于节点数,则存在负环.  两点间如果有最短路,那么每个结点最多经过一次,这条路不超过$n-1$条边. ...

  5. poj3259 Wormholes【Bellman-Ford或 SPFA判断是否有负环 】

    题目链接:poj3259 Wormholes 题意:虫洞问题,有n个点,m条边为双向,还有w个虫洞(虫洞为单向,并且通过时间为倒流,即为负数),问你从任意某点走,能否穿越到之前. 贴个SPFA代码: ...

  6. POJ3259 Wormholes 【spfa判负环】

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

  7. POJ3259——Wormholes(Bellman-Ford+SPFA)

    Wormholes DescriptionWhile exploring his many farms, Farmer John has discovered a number of amazing ...

  8. POJ--3259 Wormholes (SPFA判负环)

    题目电波   3259 Wormholes #include<iostream> #include<cstring> #include<algorithm> #in ...

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

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

  10. poj-3259 Wormholes(无向、负权、最短路之负环判断)

    http://poj.org/problem?id=3259 Description While exploring his many farms, Farmer John has discovere ...

随机推荐

  1. 在电脑上远程连接你的 云服务器( ECS)

    在与服务器上一般安装的主流操作系统   linux   和   windowsServer linux一般都是centOs系列 这个主要是连接windowsServer 系统 用xshell ,win ...

  2. Java的多路分支代码,感觉有点意思

    /** * @Author hty * @Date 2019-12-16 16:39 * @Version 1.0 */ import java.util.Random; // 比赛结果 enum O ...

  3. Java | Spring Boot Swagger2 集成REST ful API 生成接口文档

      Spring Boot Swagger2 集成REST ful API 生成接口文档 原文 简介 由于Spring Boot 的特性,用来开发 REST ful 变得非常容易,并且结合 Swagg ...

  4. 红黑树和AVL树的区别(转)

    add by zhj: AVL树和红黑树都是平衡二叉树,虽然AVL树是最早发明的平衡二叉树,但直接把平衡二叉树等价于AVL树,我认为非常不合适. 但很多地方都在这么用.两者的比较如下 平衡二叉树类型 ...

  5. Python 文件编码问题解决

    最近使用python操作文件,经常遇到编码错误的问题,例如: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbe in position ...

  6. Cglib 与 JDK动态代理

    作者:xiaolyuh 时间:2019/09/20 09:58 AOP 代理的两种实现: jdk是代理接口,私有方法必然不会存在在接口里,所以就不会被拦截到: cglib是子类,private的方法照 ...

  7. excel查找定位操作(for lutai)

    产成品出库的单价要根据订单号和存货编码引用产成品入库的单价 方法一:使用Index 和Match =INDEX(产成品入库!I2:P13    ,IF( ) ,7) 方法二:使用vlookup ,首先 ...

  8. Android开发DDMS找不到Emulator Control的方法

    1.右键DDMS,点击reset. 2.window->show view->other->android->Emulator Control

  9. rsync 排除指定目录

    背景 将Server1上的数据同步到Server2: Server1目录结构: /us_data/yahoo └── qlib ├── calendars ├── dataset_cache ├── ...

  10. Windows中常用工具

    护眼软件 f.lux https://justgetflux.com/ Typora https://www.typora.io/ Markdown工具,小巧,方便. Snipaste https:/ ...