题目链接:点击查看

题意:最短路判断负环

这里介绍三种方法判断负环,分别是spfa,bellman-ford和flyod算法,不过spfa的速度能比bellman-ford的速度慢了接近20倍是出乎

我意料的,还有一点就是,用flyod算法的时候记得手写min来代替stl的min,不然会TLE。

直接上代码吧:

SPFA:1454ms

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
#include<cmath>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=550;int maze[N][N];int cnt[N];int d[N];bool vis[N];int n,m,t;bool spfa()
{memset(vis,false,sizeof(vis));memset(d,inf,sizeof(d));memset(cnt,0,sizeof(cnt));d[1]=0;vis[1]=true;queue<int>q;q.push(1);while(!q.empty()){int tem=q.front();q.pop();vis[tem]=false;for(int i=1;i<=n;i++){if(d[i]>d[tem]+maze[tem][i]){d[i]=d[tem]+maze[tem][i];if(!vis[i]){q.push(i);vis[i]=true;cnt[i]++;if(cnt[i]>n-1)return true;}}}}return false;
}int main()
{
//  freopen("input.txt","r",stdin);int w;cin>>w;while(w--){scanf("%d%d%d",&n,&m,&t);memset(maze,inf,sizeof(maze));for(int i=1;i<=m;i++){int a,b,w;scanf("%d%d%d",&a,&b,&w);if(maze[a][b]>w){maze[a][b]=maze[b][a]=w;}}for(int i=1;i<=t;i++){int a,b,w;scanf("%d%d%d",&a,&b,&w);maze[a][b]=-w;}if(spfa())cout<<"YES"<<endl;elsecout<<"NO"<<endl;}return 0;
}

Bellman-Ford:79ms

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
#include<cmath>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=550;struct Node
{int u,v,w;
}edge[N*N];int cnt;int maze[N][N];//int cnt[N];int d[N];bool vis[N];int n,m,t;bool bellman()
{memset(d,inf,sizeof(d));d[1]=0;bool flag=false;for(int i=1;i<=n-1;i++){flag=false;for(int j=0;j<cnt;j++){  int u=edge[j].u;int v=edge[j].v;int w=edge[j].w;if(d[v]>d[u]+w){flag=true;d[v]=d[u]+w;}}if(flag==false)break;}for(int i=0;i<cnt;i++)if(d[edge[i].v]>d[edge[i].u]+edge[i].w)return true;return false;
}int main()
{
//  freopen("input.txt","r",stdin);int w;cin>>w;while(w--){scanf("%d%d%d",&n,&m,&t);cnt=0;memset(maze,inf,sizeof(maze));for(int i=1;i<=m;i++){int a,b,w;scanf("%d%d%d",&a,&b,&w);edge[cnt].u=a;edge[cnt].v=b;edge[cnt].w=w;cnt++;edge[cnt].u=b;edge[cnt].v=a;edge[cnt].w=w;cnt++;}for(int i=1;i<=t;i++){int a,b,w;scanf("%d%d%d",&a,&b,&w);edge[cnt].u=a;edge[cnt].v=b;edge[cnt++].w=-w;}if(bellman())cout<<"YES"<<endl;elsecout<<"NO"<<endl;}return 0;
} 

Flyod:1875ms

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
#include<cmath>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=550;int maze[N][N];int n,m,t;bool cn()
{for(int k=1;k<=n;k++){for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){if(maze[i][j]>maze[i][k]+maze[k][j])maze[i][j]=maze[i][k]+maze[k][j];}if(maze[k][k]<0)return true;}return false;
}int main()
{
//  freopen("input.txt","r",stdin);int w;cin>>w;while(w--){scanf("%d%d%d",&n,&m,&t);memset(maze,inf,sizeof(maze));for(int i=1;i<=n;i++)maze[i][i]=0;for(int i=1;i<=m;i++){int a,b,w;scanf("%d%d%d",&a,&b,&w);if(maze[a][b]>w){maze[a][b]=maze[b][a]=w;}}for(int i=1;i<=t;i++){int a,b,w;scanf("%d%d%d",&a,&b,&w);maze[a][b]=-w;}if(cn())printf("YES\n");elseprintf("NO\n");}return 0;
} 

POJ - 3259 Wormholes(判断负环)相关推荐

  1. POJ3259(Wormholes) 判断负环

    题意: 农夫john发现了一些虫洞,虫洞是一种在你到达虫洞之前把你送回目的地的一种方式,FJ的每个农场,由n块土地(编号为1-n),M 条路,和W个 虫洞组成,FJ想从一块土地开始,经过若干条路和虫洞 ...

  2. POJ 3259 Wormholes(负权环路)

    题意: 农夫约翰农场里发现了很多虫洞,他是个超级冒险迷,想利用虫洞回到过去,看再回来的时候能不能看到没有离开之前的自己,农场里有N块地,M条路连接着两块地,W个虫洞,连接两块地的路是双向的,而虫洞是单 ...

  3. POJ 3259 Wormholes【最短路/SPFA判断负环模板】

    农夫约翰在探索他的许多农场,发现了一些惊人的虫洞.虫洞是很奇特的,因为它是一个单向通道,可让你进入虫洞的前达到目的地!他的N(1≤N≤500)个农场被编号为1..N,之间有M(1≤M≤2500)条路径 ...

  4. Wormholes——Bellman-Ford判断负环

    [题目描述] While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A w ...

  5. 模板 - 判断负环(超时高效优化技巧)、01分数规划

    整理的算法模板合集: ACM模板 判断负环 判正环求最长路,判负环求最短路 int n; // 总点数 int h[N], w[N], e[N], ne[N], idx; // 邻接表存储所有边 in ...

  6. spfa 判断负环 (转载)

    当然,对于Spfa判负环,实际上还有优化:就是把判断单个点的入队次数大于n改为:如果总的点入队次数大于所有点两倍 时有负环,或者单个点的入队次数大于sqrt(点数)有负环.这样时间复杂度就降了很多了. ...

  7. LightOJ - 1074 Extended Traffic(最短路+判断负环)

    题目链接:点击查看 题目大意:给出n个城市,每个城市都有一个拥挤度,从a到b的时间是(b的拥挤度-a的拥挤度)^3,点1为起点,求最短时间 题目分析:这个题第一感觉是个裸题,n还非常小,偷了个懒上了一 ...

  8. UVA 558 SPFA 判断负环

    这个承认自己没看懂题目,一开始以为题意是形成环路之后走一圈不会产生负值就输出,原来就是判断负环,用SPFA很好用,运用队列,在判断负环的时候,用一个数组专门保存某个点的访问次数,超过了N次即可断定有负 ...

  9. 负环——spfa判断负环的两种方式

    第一种:(不推荐) 统计每个点的入队次数,如果某一个点入队了n次,则说明存在负环. 第二种: 统计当前每个点的最短路的边数,如果存在负环,负环上的某一个点的最短路边数一定会是正无穷,只要边数超过n(节 ...

最新文章

  1. 除了组件超配光伏效率还能如何提升?
  2. (转载)cmd-命令大全及详解
  3. SWIFT推送之本地推送(UILocalNotification)之二带按钮的消息
  4. 使用 Finder预览功能,让你可以快速浏览多个文件
  5. JavaScript单线程和浏览器事件循环简述
  6. 442个超实用电脑快捷键大全!总有你会用上的
  7. 多个html页面拼接成一个页面_浏览器渲染页面机制以及如何减少DOM操作
  8. Atitit 马尔可夫过程(Markov process) hmm隐马尔科夫。 马尔可夫链,的原理attilax总结
  9. 渗透工具——Namp基础用法
  10. flex builder的安装
  11. 微众银行--java面试题一
  12. Linux傻瓜式安装k8s
  13. cap理论具体含义_什么是CAP定理?
  14. 建筑灭火器配置设计规范
  15. 短视频后期要做哪些内容?注意细节才能做出优质短视频
  16. 微信QQ邮箱插件,附件Excel 无法打开,或者打开乱码问题
  17. 融媒体时代背景下计算机应用,融媒体背景论文10篇_发表之家
  18. 人脸检测:《MTCNN》论文详解2016
  19. YTU 2404: C语言习题 求sinh(x)
  20. 嵌入式开发学习之--点亮LED灯(中)

热门文章

  1. MySQL高级 - 日志 - 二进制日志(row及日志删除)
  2. Sentinel授权规则及规则持久化
  3. Nacos配置管理-配置热更新
  4. Curator实现分布式锁的基本原理-InterProcessMutex.internalLock
  5. MapReduce-流量统计求和-排序-JobMain代码和测试运行
  6. Lambda标准格式
  7. 单继承-继承的概念和语法
  8. 摆放家具-家具类以及创建家具对象
  9. db2 10.5 64位 linux,db2 10.5 使用列式存储
  10. AJAX框架眼镜店美瞳,PS完成对照片中人物的美瞳效果