负环--spfa
负环?是有负权边的环还是一个边权之和为负的环?
还没有准确的定义(那就先忽略吧qwq
判断负环的方法:
暴力枚举/spfa/mellman—ford/奇怪的贪心/超神的搜索
可惜我只会spfa
spfa:垂死病中惊坐起
有两种spfa可以用来求负环:dfs和bfs
在求负环上bfs要更好一些,dfs稍逊色一些
(注意:要memset,变量类型定义的时候要细致一些)
//bfs版spfa
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define ll long long
using namespace std; inline ll read()
{
ll sum = , p = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-')
p = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
(sum *= ) += ch - '';
ch = getchar();
}
return sum * p;
} const int maxn = ,maxm = ;
struct edge
{
int nxt,to;
ll wei;
} e[maxm * ];
int t,n,m,tot,cnt[maxn],head[maxn],dis[maxn];
bool vis[maxn]; void add(int a,int b,ll c)
{
e[++tot].nxt = head[a];
e[tot].to = b;
e[tot].wei = c;
head[a] = tot;
} bool spfa(int x)
{
queue<int> q;
for(int i = ; i <= n; i++)
dis[i] = 1e9;
vis[x] = true;
q.push(x);
cnt[x]++;
dis[x] = ;
while(!q.empty())
{
int u = q.front();
q.pop();
vis[u] = false;
if(cnt[u] >= n)
return true;
for(int i = head[u]; i; i = e[i].nxt)
{ int v = e[i].to;
if(dis[v] > dis[u] + e[i].wei)
{
dis[v] = dis[u] + e[i].wei;
if(!vis[v])
{
vis[v] = true;
q.push(v);
cnt[v] ++;
if(cnt[v] >= n)
return true;
}
}
}
}
return false;
} int main()
{
t = read();
while(t--)
{
n = read(),m = read();
tot = ;
memset(e,,sizeof(e));
memset(dis,,sizeof(dis));
memset(head,,sizeof(head));
memset(vis,false,sizeof(vis));
memset(cnt,,sizeof(cnt));
int a,b,c;
for(int i = ; i <= m; i++)
{
a = read(),b = read(),c = read();
add(a,b,c);
if(c >= )
add(b,a,c);
}
if(spfa())
printf("YE5\n");
else
printf("N0\n");
}
return ;
}
//dfs版spfa
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std; inline int read()
{
int sum = , p = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-')
p = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
(sum *= ) += ch - '';
ch = getchar();
}
return sum * p;
} const int maxn = ,maxm = ;
bool flag,vis[maxn];
int n,m,t;
int head[maxn],dis[maxn],cnt;
struct edge
{
int nxt,to,wei;
}e[maxm * ]; void add(int a,int b,int c)
{
e[++cnt].nxt = head[a];
e[cnt].to = b;
e[cnt].wei = c;
head[a] = cnt;
} void spfa(int x)
{
vis[x] = true;
for(int i = head[x];i;i = e[i].nxt)
{
int v = e[i].to;
if(dis[v] > dis[x] +e[i].wei)
{
if(vis[v] || flag)
{
flag = true;
break;
}
dis[v] = dis[x] +e[i].wei;
spfa(v);
}
}
vis[x] = false;
} int main()
{
t = read();
while(t--)
{
cnt = ;
flag = ;
memset(head,,sizeof(head));
memset(dis,,sizeof(dis));
memset(e,,sizeof(e));
memset(vis,false,sizeof(vis));
n = read(),m = read();
int a,b,c;
for(int i = ;i <= m;i++)
{
a = read(),b = read(),c = read();
add(a,b,c);
if(c >= )
add(b,a,c);
}
for(int i = ;i <= n;i++)
{
spfa(i);
if(flag)
break;
}
if(flag)
printf("YE5\n");
else
printf("N0\n");
}
return ;
}
负环--spfa的更多相关文章
- [P3385]【模板】负环 (spfa / bellman-ford)
终于开始认真对待图论了 因为听说一直是提高组的,动得很少,直到现在机房打提高的氛围下,开始学一些皮毛的东西 模板题目链接 这是一道求负环的题目,照理来说大家都是用spfa来判断负环的 但是我觉得bel ...
- luogu3385 负环 (spfa)
我在做spfa的时候,如果有一个点被更新了超过N次,证明这个图里是有负环的. (神TM输出YE5和N0) #include<bits/stdc++.h> #define pa pair&l ...
- 【BZOJ4773】负环 [SPFA][二分]
负环 Time Limit: 100 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 在忘记考虑负环之后,黎瑟的算法又出错 ...
- 洛谷P3385 [模板]负环 [SPFA]
题目传送门 题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个 ...
- Spfa【p3385】【模板】负环(spfa)
顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述 毒瘤数据要求判负环 分析: 还是融合了不少题解的思想的. 负环定义: 权值和为负的环 //在网络上并没有找到一个官方定义,暂且这么理解. ...
- 洛谷P3385判负环——spfa
题目:https://www.luogu.org/problemnew/show/P3385 两种方法,dfs和bfs: 一开始写的dfs,要把dis数组初值赋成0,这样从一个连着负边的点开始搜: 在 ...
- LG P2285 [模板]负环(spfa判负环)
题目描述 寻找一个从顶点1所能到达的负环,负环定义为:一个边权之和为负的环. 输入格式 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个顶点,M条边 接下来M行,每 ...
- 洛谷 P3385 【模板】负环 (SPFA)
题意:有一个\(n\)个点的有向图,从\(1\)出发,问是否有负环. 题解:我们可以用SPFA来进行判断,在更新边的时候,同时更新路径的边数,因为假如有负环的话,SPFA这个过程一定会无限重复的遍历这 ...
- UVA 558 Wormholes 【SPFA 判负环】
题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...
随机推荐
- 解决Bootstrap container样式左右内边距15px,导致屏幕不美观
首先上问题:此问题为bootstrap的 container样式导致,该样式默认左右内边距15px为了栅栏效果而设计,具体看源码css样式,如下图,右侧黄色边框边距和30px,实为两个div左浮动,将 ...
- jdk8-》reduce操作
什么是reduce操作 聚合操作,中⽂意思是 “减少” 根据⼀定的规则将Stream中的元素进⾏计算后返回⼀个唯⼀的值 常⽤⽅法⼀: Optional<T> reduce(BinaryOp ...
- python | 网络编程(socket、udp、tcp)
一.套接字 socket 1.1 作用:实现不同主机间的进程间通信(不同电脑.手机等设备之间收发数据) 1.2 分类:udp.tcp 1.3 创建 socket import socket socke ...
- ubuntu19.04 安装mysql,没有初始密码,重设初始密码
1.安装 在终端下输入 sudo apt-get install mysql-server mysql-client 进行安装,如果安装过程中弹出密码输入提示,则正常安装即可! 2.由于没有出现密码设 ...
- Python_函数进阶
楔子 假如有一个函数,实现返回两个数中的较大值: def my_max(x,y): m = x if x>y else y return mbigger = my_max(10,20)print ...
- sql sever登录问题
重启电脑后会发现连不上数据库了 按下win+r:输入cmd.连接你的ip,(telnet 127.0.0.1 xxxx)发现连接不上 正在连接127.0.0.1..无法打开到主机的连接. 在端口 14 ...
- 第四十二篇 入门机器学习——Numpy的基本操作——索引相关
No.1. 使用np.argmin和np.argmax来获取向量元素中最小值和最大值的索引 No.2. 使用np.random.shuffle将向量中的元素顺序打乱,操作后,原向量发生改变:使用np. ...
- AcWing 5. 多重背包问题 II
//二进制优化 最后变为01背包 #include <iostream> #include <algorithm> using namespace std; , M = ; i ...
- codeforce F - Three Paths on a Tree
F. Three Paths on a Tree time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- Iris配置
package main import ( "github.com/kataras/iris" "os" "encoding/json" & ...