负环--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 ...
随机推荐
- ArcGIS10:ArcGIS version not specified. You must call RuntimeManager.Bind before creating any ArcGIS
[网络转载] 今天将ArcGIS系列的软件从ArcGIS9.3.1升级到ArcGIS10,然后就使用VS创建一个简单的AE应用程序,然后拖放一个toolbar.LicenseControl以及MapC ...
- C#String类型转换成Brush类型
C#String类型转换成Brush类型: using System.Windows.Media; BrushConverter brushConverter = new BrushConverter ...
- 网页前端导出CSV,Excel格式文件
通过自己实际测试有以下几种方法 方法一通过a标签实现,把要导出的数据用“\n”和“,”拼接成一个字符串,然后把字符串放到href中,这种方法只支持chrome,firefox等非ie浏览器 html页 ...
- IntelliJ IDEA 2017.3尚硅谷-----插件的使用
在 IntelliJ IDEA 的安装讲解中我们其实已经知道,IntelliJ IDEA 本身很多功能也都 是通过插件的方式来实现的.官网插件库:https://plugins.jetbrains.c ...
- IF EXISTS 两个条件连用
当IF EXISTS要判断多个条件并存时,可以用AND连接,NOT EXISTS同理 IF EXISTS (SELECT 1 ) AND EXISTS (SELECT 2 ) BEGIN ...... ...
- 2019-08-02 纪中NOIP模拟B组
T1 [JZOJ1420] 佳肴 题目描述 佳肴就是非常美味的菜的意思,佳肴最关键的是选择好原料. 现在有N种原料,每种原料都有酸度S和苦度B两个属性,当选择多种原料时,总酸度为每种原料的酸度之积,总 ...
- MVC5+EF6 入门完整教程4 :EF基本的CRUD
上篇文章主要讲了如何配置EF, 我们回顾下主要过程: 创建Data Model ---> 创建Database Context --->创建databaseInitializer---&g ...
- C++-LUOGU2938- [USACO09FEB]股票市场Stock Market-[完全背包]
开O2,开O2,开O2 重要的事情说三遍 #include <set> #include <map> #include <cmath> #include <q ...
- [thinkphp] 启用__PUBLIC__
我真是受够了,,, 为了解决__PUBLIC__不能用的问题 我折腾了好几天了,然后终于被我找到了原因 解决过程 首先必须贴出来帮助我的人 https://my.oschina.net/u/12630 ...
- MySQL学习(八)删除表数据
表空洞的产生 删除某个行数据 或删除某个页 如下图所示,这个删除过程只是标记了某行的位置为删除,假如此时在300与600之间插入了一行数据,那么 同理,当删除某个页时,该页就会被复用.所以当删 ...