题意:有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. 第三节:EF Core上下文DbContext相关配置和生命周期

    一. 配置相关 1. 数据库连接字符串的写法 (1).账号密码:Server=localhost;Database=EFDB01;User ID=sa;Password=123456; (2).win ...

  2. Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call错误

    我这边新增的接口之后编译,启动debug后提示这个问题, 在网上找了一段时间,感觉各大神说的都好有道理,但是没有作用 so,尝试对整个工程重新编译(理论上只要重新编译修改的文件影响到的地方)

  3. 搭建zipkin并以mysql的方式存储数据

    zipkin以mysql的方式存储 (centos+java8+mysql+zipkin2.3.1) 前言: 这篇教程用于搭建已mysql作为存储的zipkin.(还不知道zipkin是什么的小伙伴请 ...

  4. (一)将mockjs集成到VUE中后,怎样根据接口入参返回mock结果

    1)安装mockjs,这一步跳过 2)在项目中建立mock模块,笔者的目录结构如下 mock模块与接口模块一一对应,有一个接口,就有一个mock 3)编写登陆模块mock接口,代码如下: import ...

  5. C#事件和委托(C#学习笔记03)

    委托 1. C# 中的委托类似于 C 或 C++ 中指向函数的指针.委托表示引用某个方法的引用类型变量,运行时可以更改引用对象. 2. 特别地,委托可以用于处理事件或回调函数.并且,所有的委托类都是从 ...

  6. WebAPI 权限控制解决方案——Phenix.NET企业应用软件快速开发平台.使用指南.21.WebAPI服务(三)

    21.1   数据服务 21.1.1基本操作功能 Phenixヾ的数据服务,提供了如下的基本操作: 功能 Type URI 参数 完整获取实体集合对象 GET api/Data 分页获取实体集合对象 ...

  7. 通过调试vue-cli 构建代码学习vue项目构建运行过程

    我们知道vue-cli 3.0之前直接基于webpack创建对应配置文件,我们通过学习webpack就能够了解其构建过程,然而从vue-cli 3.0开始,vue-cli命令行更改为@vue/cli以 ...

  8. 2019 拉卡拉java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.拉卡拉等公司offer,岗位是Java后端开发,因为发展原因最终选择去了拉卡拉,入职一年时间了,也成为了面试官 ...

  9. Swgger2的简单使用

    编写接口文档是一个非常枯燥的工作,我们采用Swagger2这套自动化文档工具来生成文档,它可以轻松的整合到Spring Boot中,并与Spring MVC程序配合组织出强大RESTful API文档 ...

  10. Linux环境:VMware下windows虚拟机与linux主机进行文件共享的方法

    操作主要分两大步骤: 一.是对主机进行配置: 二.是在虚拟机上直接连接共享目录. 一.主机配置 1.打开VMware虚拟机,双击需要进行文件共享的虚拟机.如下图,双击CentOS 64位(以linux ...