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 ...
随机推荐
- table td的宽度详解
前言:一直总觉得td的宽度好难驾驭,但万事万物总是有规律的.就像亮剑说的:不用因为怕八路就敬而远之,应该靠上去,熟悉他们,了解他们. 正文: Table只有Table的宽度是可 ...
- 上位机控制led
使用库函数,调试的结果在标红程序上,int main(void){ u8 a; u8 t; u8 len; u16 ti ...
- 预编译 .pch文件
如果工程导入了其他编程语言文件混编的时候 .pch文件会在程序开始的时候导入所有头文件,需要 '预编写命令' 区分编程语言的头文件. 下面报错就是因为工程导入了.c 文件 .pch全局导入了O ...
- Python ~~~ 面向对象的利器
class Rectangle(): # 有没有括号都行 . def __init__(self,x,y): self.x=x self.y=y def getPeri(self): def getA ...
- IOS 作业项目(4)步步完成 画图 程序(上)
先上流程图
- 步步入佳境---UI入门(4) --简单练习
一,创建SingleViewApplication 1,UILabel的简单使用 UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(0, ...
- VM命令行操作
vim-cmd vmsvc/getallvms /查看ESXi上所有虚拟机信息,主要查看虚拟机对应的ID号 vim-cmd vmsvc/power.on <VM ID> /对应ID的虚 ...
- Android pix转换为sp
/** * 把pix值转换为sp * * @return */ public static float px2sp(Context context, float pixValue) { final f ...
- windows服务部署与卸载
同事问到windows service的东东,现在整理一下,用c#如何创建一个windows service,以及如何调试.部署.卸载. 一.创建windows service 1. 打开VS2008 ...
- 《深入浅出Node.js》第3章 异步I/O
@by Ruth92(转载请注明出处) 第3章 异步I/O Node 的基调:异步 I/O.事件驱动.单线程. Node 不再是一个服务器,而是一个可以基于它构建各种高速.可伸缩网络应用的平台. No ...