luoguP3385 【模板】负环(dfs_Bellman)
来源:互联网 发布:亿维雅 知乎 编辑:程序博客网 时间:2024/06/06 03:35
题目链接
分析:
这道题如题面所说,普通的算法会T
一般Bellman的思想是:
采用广度优先,每当我们扩展出一个新的节点,总是把它放到队列的末尾,其缺点是中断了迭代的连续性
而实际上如果采用深度优先的思想,我们可以直接从这个新节点继续往下扩展
于是算法的实现方式可以改成不断从新节点往下递归进行求解
而对于负环的判断则显得更为简单,因为假如存在负环a1->a2->….ak->a1,那么算法运行时,会从某个点a1开始Dfs,最后又回到了这个点
所以只需用一个辅助数组记录当前节点是否在递归栈中便可及时检测出负环
tip
由于这是Bellman的变种,所以每次遍历完一个点,ta的入栈情况要修改成未入栈(和Bellman一样)
注意输出格式
//这里写代码片#include<cstdio>#include<cstring>#include<iostream>#include<queue>using namespace std;const int N=200005;const int mod=5000000;struct node{ int x,y,v,nxt;};node way[N<<1];int st[N],tot=0;int dis[N],n,m;bool in[N],ff;void add(int u,int w,int z){ tot++; way[tot].x=u;way[tot].y=w;way[tot].v=z;way[tot].nxt=st[u];st[u]=tot;}//int Bellman()//{// queue<int> Q;// memset(cnt,0,sizeof(cnt));// memset(in,0,sizeof(in));// for (int i=1;i<=n;i++)// {// dis[i]=0;// Q.push(i);// in[i]=1;// } // while (!Q.empty())// {// int now=Q.front(); Q.pop();// in[now]=0;// for (int i=st[now];i;i=way[i].nxt)// if (dis[way[i].y]>dis[now]+way[i].v)// {// dis[way[i].y]=dis[now]+way[i].v;// if (!in[way[i].y])// {// in[way[i].y]=1;// Q.push(way[i].y);// if (++cnt[way[i].y]>n) return 1;// }// }// }// return 0;//}void Bellman(int now){ if (ff) return; //存在环 in[now]=1; for (int i=st[now];i;i=way[i].nxt) if (dis[way[i].y]>dis[now]+way[i].v&&ff==0) { dis[way[i].y]=dis[now]+way[i].v; if (in[way[i].y]) { ff=1; return; } else Bellman(way[i].y); } in[now]=0; //入栈状态 return;}int main(){ int T; scanf("%d",&T); while (T--) { memset(st,0,sizeof(st)); tot=0; scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { int u,w,z; scanf("%d%d%d",&u,&w,&z); add(u,w,z); if (z>=0) add(w,u,z); } memset(in,0,sizeof(in)); //访问记录 memset(dis,0,sizeof(dis)); //最短路 ff=0; for (int i=1;i<=n;i++) { Bellman(i); if (ff) break; } if (ff) printf("YE5\n"); //输出有毒 else printf("N0\n"); } return 0;}
阅读全文
0 0
- luoguP3385 【模板】负环(dfs_Bellman)
- 洛谷P3385 【模板】负环
- POJ3259 Wormholes(spfa判断负环模板题)
- [模板]poj3259(判断是否存在负环)
- POJ3259 Wormholes(最短路,有无负环,spfa,模板)
- POJ3259 Wormholes 洛谷P3385 【模板】负环
- 高精度加法(非负)模板
- 【洛谷1593】【模板】template负环 递归SPFA判负环
- [模板]负环---dfs版spfa
- 高精度运算类bign(非负整数)模板
- Wormholes (判断负环)
- [POJ3259]Wormholes(负环)
- 偶遇spfa()判断负环
- bzoj 1715(spfa 判断负环)
- easy sssp(spfa判断负环)
- poj 3259 Wormholes(判断负环)
- poj3259Wormholes(bellman_ford判断负环)
- POJ3259 Wormholes(Bellmanford判断负环)
- OpenStack双网卡、多节点搭建
- 使用MVP模式+Retrofit+Fresco加载网络数据
- mysql 安装
- Pat 1021. 个位数统计 (15)
- 分治算法---最大子数组
- luoguP3385 【模板】负环(dfs_Bellman)
- Python中非字符串变量公共方法
- 数据结构上机实验学习体会
- C++浅谈new和delete
- Android面试常客--四大组件之BroadcastReceiver
- 堆和栈的区别
- win10自带移动热点启动 手机访问本地服务器
- FiddlerScript详解
- 判断文件是否存在的另一种方法 _access 和 _waccess