poj3259 最短路判环
2015-09-06 12:00
211 查看
题意:有一些点、一些道路和一些虫洞,道路是双向的,连接两点,花费正的时间,而虫洞是单向的,连接两点,可以使时间倒退,求是否能够回到过去。
只要明确回到过去其实就是当出现一个负环的时候,不断沿这个环走,就能够实现时间倒退了。
然后就是判负环……
spfa版:
View Code
只要明确回到过去其实就是当出现一个负环的时候,不断沿这个环走,就能够实现时间倒退了。
然后就是判负环……
spfa版:
#include<stdio.h> #include<string.h> int head[505],next[6000],point[6000],val[6000],size=0; int a,b,v,dis[505],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]=0; for(i=1;i<=n-1;i++){ for(j=1;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=0; for(i=1;i<=n;i++){ for(j=head[i];~j;j=next[j]){ int p=point[j]; if(dis[p]>dis[i]+val[j]){ f=1; } } } if(f)printf("YES\n"); else printf("NO\n"); } int main(){ int f; while(scanf("%d",&f)!=EOF){ for(int q=1;q<=f;q++){ int m,w; scanf("%d%d%d",&n,&m,&w); size=0; memset(head,-1,sizeof(head)); int i; for(i=1;i<=m;i++){ scanf("%d%d%d",&a,&b,&v); add(a,b,v); add(b,a,v); } for(i=1;i<=w;i++){ scanf("%d%d%d",&a,&b,&v); add(a,b,-v); } bf(1); } } return 0; }
View Code
相关文章推荐
- MySQL数据库加密与解密
- Quartz任务调度2
- Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.
- C++中的多态性
- 从零开始学习嵌入式 - 什么是Endianness?
- Quartz参数说明
- 人和机器的视觉体验:为什么人工智能“会做梦”?
- 运用神经网络方法找寻集成学习中的最优权重
- cocos2d-x设计模式发掘之三:管理者模式
- 验证控件
- Javascript模块化编程-require.js[3]
- mysql innodb count(*)速度慢且不准确的解决办法
- textView画横线需求
- 使用play时使用JPA查询,还是原生SQL查询
- QUARTUS ii中IP核破解
- dede调用导航/幻灯
- Python 父目录获取
- activity工作流
- 安装hadoop-2.3.0-cdh5.1.2
- IBM Storwize V3500存储配置