洛谷 P3385 判负环dfs
2018-03-31 16:02
183 查看
原题戳
emmmmmm,200000万条边居然能T掉,果断学了新的算法,dfs-spfa(),判负环;
因为只需要判负环,所以初始dis数组为0,这时如果没有负环的话,要么不会更新,要么只更新一遍,效率比spfa快好多
前向星写法By Acer.Mo
emmmmmm,200000万条边居然能T掉,果断学了新的算法,dfs-spfa(),判负环;
因为只需要判负环,所以初始dis数组为0,这时如果没有负环的话,要么不会更新,要么只更新一遍,效率比spfa快好多
前向星写法By Acer.Mo
#include<cmath> #include<queue> #include<stack> #include<deque> #include<vector> #include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int INF=1<<29,M=500500; int dis[M],vis[M],cnt[M]; int n,m,tot,flag; int head[M],next[M],go[M],cost[M]; void add(int a,int b,int c) { go[tot]=b; cost[tot]=c; next[tot]=head[a]; head[a]=tot++; if (c>=0) { go[tot]=a; cost[tot]=c; next[tot]=head[b]; head[b]=tot++; } return ; } void dfspfa(int x) { if (flag) return ; vis[x]=1; for (int i=head[x];i!=-1;i=next[i]) { int to=go[i]; int pay=cost[i]; if (dis[to]>dis[x]+pay) { dis[to]=dis[x]+pay; if (vis[to]) { flag=1; return ; } else dfspfa(to); } } vis[x]=0; return ; } int main() { int t; scanf("%d",&t); while (t--) { scanf("%d %d",&n,&m); fill(head,head+n+1,-1); fill(go,go+n+1,0); fill(cost,cost+n+1,0); fill(next,next+n+1,0); fill(dis,dis+n+1,0); fill(vis,vis+n+1,0); tot=0;flag=0; for (int i=1;i<=m;i++) { int a,b,c; scanf("%d %d %d",&a,&b,&c); add(a,b,c); } for (int i=1;i<=n;i++) { dfspfa(i); if (flag) break; } if (flag) printf("YE5\n"); else printf("N0\n"); } return 0; }STL写法By Acer.Mo
#include<cmath> #include<queue> #include<stack> #include<deque> #include<vector> #include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int INF=1<<29,M=500500; int dis[M],vis[M],cnt[M]; int n,m,flag; struct edge { int cost; int to; }; vector<edge>v[M]; void dfspfa(int x) { if (flag) return ; vis[x]=1; for (int i=0;i<v[x].size();i++) { int to=v[x][i].to; int pay=v[x][i].cost; if (dis[to]>dis[x]+pay) { dis[to]=dis[x]+pay; if (vis[to]) { flag=1; return ; } else dfspfa(to); } } vis[x]=0; return ; } int main() { int t; scanf("%d",&t); while (t--) { scanf("%d %d",&n,&m);flag=0; fill(dis,dis+n+1,0); fill(vis,vis+n+1,0); for (int i=1;i<=m;i++) { int a,b,c;edge now; scanf("%d %d %d",&a,&b,&c); now.cost=c; now.to=b; v[a].push_back(now); if (c>=0) { now.to=a; v[b].push_back(now); } } for (int i=1;i<=n;i++) { dfspfa(i); if (flag) break; } if (flag) printf("YE5\n"); else printf("N0\n"); for (int i=1;i<=n;i++) { v[i].clear(); } } return 0; }
相关文章推荐
- POJ3259 Wormholes 洛谷P3385 【模板】负环
- 引水入城(dfs的做法)洛谷p1514
- dfs版SPFA判负环
- 洛谷 P1019 单词接龙【经典DFS,温习搜索】
- 洛谷P1120 小木棍(dfs)
- UVa 11090 Going in Cycle!!(环上平均值最大+SPFA DFS判负环)
- 洛谷 1784 数独 dfs
- HDU1317 - XYZZY - 最短路判负环+dfs
- 洛谷 P3953 逛公园【spfa+记忆化dfs+bfs】
- 洛谷 2680[NOIP2015] 运输计划 二分+lca+树上差分+dfs序
- 【洛谷 P1710】地铁涨价(dfs+bfs)
- 【DFS+数论】洛谷P1118数字三角形
- 洛谷 P1141 01迷宫 (dfs)
- 【AC自动机】【树状数组】【dfs序】洛谷 P2414 [NOI2011]阿狸的打字机 题解
- 洛谷P1120小木棍[DFS]
- SPFA判负环|BFS|DFS
- 洛谷 1219 八皇后 【DFS】
- 洛谷P2420 让我们异或吧 树上差分 dfs
- 【洛谷1593】【模板】template负环 递归SPFA判负环
- 洛谷P3385 负环