博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LightOJ 1074 spfa判断负环
阅读量:6415 次
发布时间:2019-06-23

本文共 1942 字,大约阅读时间需要 6 分钟。

题意是给出一个有向图 给出一定的边 可以求出边权 求单源最短路 如果<3 或者 达不到 输出问号 不然输出dis[v]

一开始耿直的写了一个dij交上去 还过了样例 然后wa掉 看了看题 发现其中有负权边 并且应该是可以达到负环的 比如3->1->2->3 所以<3是判断 这个点能否是负的 或者 它的确小于3

如果一个点在负环中 那么dis[it]可以是无限小 那么它所能到达的所有点 都可以是无限小 

使用spfa判断 当一个点被证实是在负环中 dfs它 把它与它能到达的所有的点标记

需要注意的是 松弛的时候判断松弛边的起点有没有被标记 如果它被标记过 说明 它能松弛的那个点一定也被标记过了 那么就跳过这个边就可以了

#include
#include
#include
#include
#include
#include
using namespace std;int a[205];int n,m,q;struct node{ int v; int w; int nex;};int l(int x){ return x*x*x;}node b[40050];int point[205];int cnt;void add(int u,int v,int w){ b[cnt].v=v; b[cnt].w=w; b[cnt].nex=point[u]; point[u]=cnt; cnt++;}bool vis[205];int dis[205];int c[205];bool f[205];void dfs(int u){ f[u]=true; for(int tt=point[u];tt!=-1;tt=b[tt].nex) { int v=b[tt].v; if(f[v]==false) { dfs(v); } }}void spfa(){ for(int i=1;i<=n;i++) dis[i]=999999999; dis[1]=0; for(int i=1;i<=n;i++) vis[i]=true; for(int i=1;i<=n;i++) c[i]=0; for(int i=1;i<=n;i++) f[i]=false; vis[1]=false; c[1]++; queue
q; q.push(1); while(!q.empty()) { int u=q.front();q.pop(); vis[u]=true; for(int tt=point[u];tt!=-1;tt=b[tt].nex) { int v=b[tt].v; int w=b[tt].w; if(dis[v]>dis[u]+w&&f[u]==false) /// 如果不加上f[u]==false 会超时 如果f[u]==true 那么说明它能到达的点(松弛的点)一定也是f[v]==true 了 { dis[v]=dis[u]+w; if(vis[v]) { vis[v]=false; c[v]++; if(c[v]>=n&&f[v]==false) { dfs(v); } else { q.push(v); } } } } }}int main(){int t;int tt=0;scanf("%d",&t);while(t--){ tt++; cnt=0; scanf("%d",&n); for(int i=1;i<=n;i++) point[i]=-1; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } scanf("%d",&m); for(int i=1;i<=m;i++) { int u,v; int w; scanf("%d%d",&u,&v); w=l(a[v]-a[u]); add(u,v,w); } scanf("%d",&q); spfa(); printf("Case %d:\n",tt); for(int i=1;i<=q;i++) { int x; scanf("%d",&x); int ans=dis[x]; if(ans<3||ans==999999999) printf("?\n"); else printf("%d\n",ans); }}}

  

转载于:https://www.cnblogs.com/rayrayrainrain/p/5554148.html

你可能感兴趣的文章
蚂蚁分类信息系统5.8多城市UTF8开源优化版
查看>>
在django1.2+python2.7环境中使用send_mail发送邮件
查看>>
“Metro”,移动设备视觉语言的新新人类
查看>>
PHP源代码下载(本代码供初学者使用)
查看>>
Disruptor-NET和内存栅栏
查看>>
Windows平台ipod touch/iphone等共享笔记本无线上网设置大全
查看>>
播放加密DVD
查看>>
产品设计体会(3013)项目的“敏捷沟通”实践
查看>>
RHEL6.3基本网络配置(1)ifconfig命令
查看>>
网络诊断工具之—路由追踪tracert命令
查看>>
Java模拟HTTP的Get和Post请求(增强)
查看>>
php 环境搭建(windows php+apache)
查看>>
让虚拟机的软盘盘符不显示(适用于所有windows系统包括Windows Server)
查看>>
Cygwin不好用
查看>>
jQuery插件之验证控件jquery.validate.js
查看>>
[经验]无线鼠标和无线键盘真的不能用了?——雷柏的重生之路~
查看>>
【转】plist涉及到沙盒的一个问题
查看>>
GNU make manual 翻译( 一百四十五)
查看>>
重构之美-走在Web标准化设计的路上[复杂表单]3 9 Update
查看>>
linux中的优先搜索树的实现--prio_tree【转】
查看>>