poj3259Wormholes
来源:互联网 发布:stm32编程环境 编辑:程序博客网 时间:2024/06/08 15:15
题目大意:
给你一幅地图,没两个点之间的路程所需的时间告诉你,然后又告诉你一些虫洞,可以让你从虫洞穿越到另一个地点,但是不是花费时间,而是能回过去一段时间。问你存不存在从一个地点出发然后经过一系列的虫洞穿梭时空回到出发前的这个地点(指的是时间上的出发前).
解题思路:
首先我要感谢猴哥给的这道题,之前没有做过带负权回路的题目,这下碰到了,而且非常的经典。其实本题的解题思路就是让你判断是否存在负权回路。
bellman flyod spfa都可以判断是否存在负权回路,但是我采用的是spfa,双向队列优化之后就变得很快了。
#include<stdio.h>#include<vector>#include<queue># define inf 0xFFFFFFF# define N 600using namespace std;struct node{ int to; int weight;};vector<node>mp[N];bool in_q[N];int in_c[N];int dis[N];int n;int m;bool spfa(){ int i,j,to,cur; deque<int> q; for(i=1;i<=n;i++) { q.push_back(i); in_q[i]=true; in_c[i]=1; dis[i]=0; } while(!q.empty()) { cur=q.front(); q.pop_front(); in_q[cur]=false; for(i=0;i<mp[cur].size();i++) { to=mp[cur][i].to; if(dis[cur]<inf&&(dis[to]>mp[cur][i].weight+dis[cur])){ dis[to]=mp[cur][i].weight+dis[cur]; if(!in_q[to]) { in_q[to]=true; in_c[to]++; if(in_c[to]>=n){ return false; } //每次都将最短的放在第一个,那么就能快速的确认是否存在负权回路了 if(!q.empty()){ if(dis[to]>q.front()){ q.push_back(to); }else q.push_front(to); }else q.push_back(to); } } } } return true;}int main(){ int f,w,x,y,z,i,j; node temp; bool ans; scanf("%d",&f); while(f--){ scanf("%d%d%d",&n,&m,&w); for(i=0;i<=n+9;i++) mp[i].clear(); for(i=0;i<m;i++) { scanf("%d%d%d",&x,&y,&z); temp.to=y; temp.weight=z; mp[x].push_back(temp); temp.to=x; mp[y].push_back(temp); } for(i=0;i<w;i++) { scanf("%d%d%d",&x,&y,&z); temp.to=y; temp.weight=-z; mp[x].push_back(temp); } ans=spfa(); if(ans){ printf("NO\n"); }else{ printf("YES\n"); } } return 0;}
0 0
- poj3259Wormholes
- poj3259Wormholes
- POJ3259Wormholes
- poj3259Wormholes【最短路(判负环)】
- poj3259Wormholes【SPFA判负环】
- poj3259Wormholes Bellman-Ford
- POJ3259Wormholes(bellman-ford找负环)
- poj3259Wormholes【最短路SPFA判断负环】
- poj3259Wormholes(bellman_ford判断负环)
- poj3259Wormholes(bellman判断负环的问题最短路)
- Linux 2.6 中的文件锁
- 女大学生种蔬菜创业故事
- 翻译03
- 动态规划-minipaint
- uva 10341 - Solve It(二分查找水题)
- poj3259Wormholes
- 神、上帝以及老天爷
- IOS开发常用函数
- 广播和广播接受者知识点分类
- leetcode: Linked List Cycle II
- Tesseract 识别 Tiff 格式文件——alpha通道干扰
- Android界面——Button按钮的一些事
- XCode快捷键
- C++复数运算符重载(+与<<)