POJ 3259(最短路径)
2016-01-25 09:50
260 查看
题目链接:http://poj.org/problem?id=3259
题意:现在有n个点,m条边,w个虫洞,给出m个a,b,c,表示从a到b需要花费c时间,从b到a需要话费c时间,然后给出w个a,b,c,表示从a到b花费-c个时间,问是否存在一条路径使得最终回到源点的时间比初始时间小。
思路:最短路径,Bellman-Ford或SPFA判断是否存在负环的问题。
注意:数据范围比题目中给的略大一点,这点略坑。
题意:现在有n个点,m条边,w个虫洞,给出m个a,b,c,表示从a到b需要花费c时间,从b到a需要话费c时间,然后给出w个a,b,c,表示从a到b花费-c个时间,问是否存在一条路径使得最终回到源点的时间比初始时间小。
思路:最短路径,Bellman-Ford或SPFA判断是否存在负环的问题。
注意:数据范围比题目中给的略大一点,这点略坑。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> using namespace std; const int INF=0x3f3f3f3f; const int maxn=1010; int T,n,m,w; int dis[maxn]; int eNum; struct Edge{ int s; int e; int t; }edge[10000]; void addEdge(int s,int e,int t){ edge[eNum].s=s; edge[eNum].e=e; edge[eNum].t=t; eNum++; } bool Bellman_Ford(){ for(int i=1;i<=n;i++) dis[i]=INF; dis[1]=0; for(int i=1;i<n;i++){ for(int j=0;j<eNum;j++){ if(dis[edge[j].e]>dis[edge[j].s]+edge[j].t){ dis[edge[j].e]=dis[edge[j].s]+edge[j].t; } } } for(int k=0;k<eNum;k++){ if(dis[edge[k].e]>dis[edge[k].s]+edge[k].t){ return true; } } return false; } int main(){ #ifndef ONLINE_JUDGE freopen("test.in","r",stdin); freopen("test.out","w",stdout); #endif scanf("%d",&T); while(T--){ scanf("%d%d%d",&n,&m,&w); eNum=0; int s,e,t; for(int i=0;i<m;i++){ scanf("%d%d%d",&s,&e,&t); addEdge(s,e,t); addEdge(e,s,t); } for(int i=0;i<w;i++){ scanf("%d%d%d",&s,&e,&t); addEdge(s,e,-t); } bool ans=Bellman_Ford(); if(ans) puts("YES"); else puts("NO"); } return 0; }
相关文章推荐
- lucene searchafter分页
- U盘做svn版本控制
- java提高篇(九)-----详解匿名内部类
- DE14 Interpretation of the Exceptional Case: Resonance
- Java工程师成神之路~
- gulp进阶-自定义gulp插件
- Swift中文教程(七) 闭包
- ES6学习——生成器(Generators):概念介绍
- java提高篇(八)-----实现多重继承
- Python爬虫实战(4):抓取淘宝MM照片
- BDI模型
- spring配置文件相关
- sql server 表值类型的使用
- DE13 Finding Particular Solutions to Inhomogeneous ODEs
- 通常有数据交互的,就不叫静态页面
- Android的任务栈task stack
- Swift中文教程(六)函数
- 【linux j2ee环境搭建】之一:jdk环境变量配置
- java提高篇(七)-----详解内部类
- VI / VIM键盘图