poj3259 最短路判环
题意:有一些点、一些道路和一些虫洞,道路是双向的,连接两点,花费正的时间,而虫洞是单向的,连接两点,可以使时间倒退,求是否能够回到过去。
只要明确回到过去其实就是当出现一个负环的时候,不断沿这个环走,就能够实现时间倒退了。
然后就是判负环……
spfa版:
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std; int head[],next[],point[],val[],size;
int n,dis[],t[];
bool vis[]; void add(int a,int b,int v){
int i;
for(i=head[a];~i;i=next[i]){
if(point[i]==b){
if(val[i]>v)val[i]=v;
return;
}
}
point[size]=b;
val[size]=v;
next[size]=head[a];
head[a]=size++;
} void spfa(int s){
memset(vis,,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
memset(t,,sizeof(t));
queue<int>q;
dis[s]=;
q.push(s);
vis[s]=;
t[s]++;
int i;
bool f=;
while(!q.empty()&&f){
int u=q.front();
q.pop();
vis[u]=;
for(i=head[u];~i;i=next[i]){
int j=point[i];
if(dis[j]>dis[u]+val[i]){
dis[j]=dis[u]+val[i];
q.push(j);
t[j]++;
vis[j]=;
if(t[j]>n)f=;
}
}
}
if(f)printf("NO\n");
else printf("YES\n");
} int main(){
int f;
while(scanf("%d",&f)!=EOF){
for(int q=;q<=f;q++){
int w,m,i;
scanf("%d%d%d",&n,&m,&w);
memset(head,-,sizeof(head));
size=;
for(i=;i<=m;i++){
int a,b,v;
scanf("%d%d%d",&a,&b,&v);
add(a,b,v);
add(b,a,v);
}
for(i=;i<=w;i++){
int a,b,v;
scanf("%d%d%d",&a,&b,&v);
add(a,b,-v);
}
spfa();
}
}
return ;
}
bellman-fold版:
#include<stdio.h>
#include<string.h> int head[],next[],point[],val[],size=;
int a,b,v,dis[],n; void add(int a,int b,int v){
int i;
for(i=head[a];~i;i=next[i]){
if(point[i]==b){
if(val[i]>v)val[i]=v;
return;
}
}
point[size]=b;
val[size]=v;
next[size]=head[a];
head[a]=size++;
} void bf(int s){
int i,j,k;
memset(dis,0x3f,sizeof(dis));
dis[s]=;
for(i=;i<=n-;i++){
for(j=;j<=n;j++){
for(k=head[j];~k;k=next[k]){
int p=point[k];
if(dis[p]>dis[j]+val[k]){
dis[p]=dis[j]+val[k];
}
}
}
}
bool f=;
for(i=;i<=n;i++){
for(j=head[i];~j;j=next[j]){
int p=point[j];
if(dis[p]>dis[i]+val[j]){
f=;
}
}
}
if(f)printf("YES\n");
else printf("NO\n");
} int main(){
int f;
while(scanf("%d",&f)!=EOF){
for(int q=;q<=f;q++){
int m,w;
scanf("%d%d%d",&n,&m,&w);
size=;
memset(head,-,sizeof(head));
int i;
for(i=;i<=m;i++){
scanf("%d%d%d",&a,&b,&v);
add(a,b,v);
add(b,a,v);
}
for(i=;i<=w;i++){
scanf("%d%d%d",&a,&b,&v);
add(a,b,-v);
}
bf();
}
}
return ;
}
poj3259 最短路判环的更多相关文章
- poj2240 最短路判环
题意:与poj1680一样,有不同的换钱渠道,可以完成特定两种货币的交换,并且有汇率,只不过此题是单向边,然后问是否能使财富增加 与poj1680一样,建图之后直接spfa判增值的环即可 #inclu ...
- poj1680 最短路判环
题意:有多个银行可以换钱,每个银行可以将特定的两种钱相互兑换,并且有自己的汇率,现在问是否可以将自己的钱通过银行兑换增加. 其实比较水,主要就是知道最短路问题里的负环可以通过bellman-fold或 ...
- 【BZOJ 3232】圈地游戏 二分+SPFA判环/最小割经典模型
最小割经典模型指的是“一堆元素进行选取,对于某个元素的取舍有代价或价值,对于某些对元素,选取后会有额外代价或价值”的经典最小割模型,建立倒三角进行最小割.这个二分是显然的,一开始我也是想到了最小割的那 ...
- Lightoj1003【判环操作】
题意: 对于n个给出字符串a,b,理解成a在b之前办好这个事情,要求n个给出两个串,a都要在b之前完成: 题意: 所以一旦出现环就不行了: 以前在写最短路的时候,spfa就有一个判环,后来写着写着写到 ...
- hdu4975 A simple Gaussian elimination problem.(正确解法 最大流+删边判环)(Updated 2014-10-16)
这题标程是错的,网上很多题解也是错的. http://acm.hdu.edu.cn/showproblem.php?pid=4975 2014 Multi-University Training Co ...
- hdu4888 Redraw Beautiful Drawings 最大流+判环
hdu4888 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/6553 ...
- Leetcode 166. Fraction to Recurring Decimal 弗洛伊德判环
分数转小数,要求输出循环小数 如2 3 输出0.(6) 弗洛伊德判环的原理是在一个圈里,如果一个人的速度是另一个人的两倍,那个人就能追上另一个人.代码中one就是速度1的人,而two就是速度为2的人. ...
- Leetcode 202 Happy Number 弗洛伊德判环解循环
今天先谈下弗洛伊德判环,弗洛伊德判环原来是在一个圈内有两人跑步,同时起跑,一人的速度是另一人的两倍,则那个人能在下一圈追上另一个人,弗洛伊德判环能解数字会循环出现的题,比如说判断一个链表是不是循环链表 ...
- Dwarves (有向图判环)
Dwarves 时间限制: 1 Sec 内存限制: 64 MB提交: 14 解决: 4[提交][状态][讨论版] 题目描述 Once upon a time, there arose a huge ...
随机推荐
- Android drawBitmapMesh扭曲图像
今天介绍一下在Android当中怎么扭曲图像,在Android系统中的Canvas提供了一个drawBitmapMesh(Bitmap bitmap, int meshWidth, int meshH ...
- [Java]eclipse的使用
1.android sdk help安装 使用SDK Manager.exe下载android sdk的时候把docs也勾选上. 在eclipse的android工程下的android.jar(在an ...
- jenkins持续集成工具
jenkins是开源的 持续集成.持续构建的可视化web工具,持续构建说直白,就是各种项目的自动化编译.打包.分发部署. 好很多优点: 1.支持多语言 2.跟svn.git能无缝集成 3.直接与知名源 ...
- rcc
一.在STM32中,有五个时钟源,为HSI.HSE.LSI.LSE.PLL. 全名: high speed external ①HSI是高速内部时钟,RC振荡器,频率为8MHz. ②HSE是高 ...
- Ant、Maven、Gradle
android Gradle project http://www.ibm.com/developerworks/cn/opensource/os-cn-gradle/ http://www.voge ...
- 微信分享 添加URL Schemes
1. TARGETS - Info - URL Types identifier -> weixin URL Schemes -> 应用id 2.在AppDelegate.h 引入头文件 ...
- 如何调用super
因此,决定是否调用 super,基于您打算如何重新实施方法: 如果打算补充超类实现的行为,请调用 super. 如果打算替换超类实现的行为,就不要调用 super. 如果您要补充超类行为,另一个需要重 ...
- ES6:模块简单解释
modules是ES6引入的最重要的一个特性. 以后写模块的时候就直接按照ES6的modules语法来写 ,然后用babel+browserify 来打包就行了. modules规范分两部分,一部分是 ...
- Python 的property的实现 .
描述符.就是 将某种特殊类型①的类的实例指派给另一个类的属性 ①只要实现一下三种方法的其中一个就是特殊类型. __get__(self,instance,owner) -用于访问属性,他返回属性的值. ...
- linux下vi命令
Vi共分三种模式,分别是“一般模式”.“编辑模式”与“命令行命令模式”. 1.一般模式:vi处理文件时,一进入该文件就是一般模式.在这个模式中,可以使用“上下左右”键来移动光标,可以使用“删除字符”或 ...