洛谷板子题

负环?是有负权边的环还是一个边权之和为负的环?

还没有准确的定义(那就先忽略吧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的更多相关文章

  1. [P3385]【模板】负环 (spfa / bellman-ford)

    终于开始认真对待图论了 因为听说一直是提高组的,动得很少,直到现在机房打提高的氛围下,开始学一些皮毛的东西 模板题目链接 这是一道求负环的题目,照理来说大家都是用spfa来判断负环的 但是我觉得bel ...

  2. luogu3385 负环 (spfa)

    我在做spfa的时候,如果有一个点被更新了超过N次,证明这个图里是有负环的. (神TM输出YE5和N0) #include<bits/stdc++.h> #define pa pair&l ...

  3. 【BZOJ4773】负环 [SPFA][二分]

    负环 Time Limit: 100 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 在忘记考虑负环之后,黎瑟的算法又出错 ...

  4. 洛谷P3385 [模板]负环 [SPFA]

    题目传送门 题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个 ...

  5. Spfa【p3385】【模板】负环(spfa)

    顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述 毒瘤数据要求判负环 分析: 还是融合了不少题解的思想的. 负环定义: 权值和为负的环 //在网络上并没有找到一个官方定义,暂且这么理解. ...

  6. 洛谷P3385判负环——spfa

    题目:https://www.luogu.org/problemnew/show/P3385 两种方法,dfs和bfs: 一开始写的dfs,要把dis数组初值赋成0,这样从一个连着负边的点开始搜: 在 ...

  7. LG P2285 [模板]负环(spfa判负环)

    题目描述 寻找一个从顶点1所能到达的负环,负环定义为:一个边权之和为负的环. 输入格式 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个顶点,M条边 接下来M行,每 ...

  8. 洛谷 P3385 【模板】负环 (SPFA)

    题意:有一个\(n\)个点的有向图,从\(1\)出发,问是否有负环. 题解:我们可以用SPFA来进行判断,在更新边的时候,同时更新路径的边数,因为假如有负环的话,SPFA这个过程一定会无限重复的遍历这 ...

  9. UVA 558 Wormholes 【SPFA 判负环】

    题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...

随机推荐

  1. VAR模型学习笔记

    目录 1 定义 VAR模型的具体步骤 建模步骤及公式 代码实现 1 定义 VAR模型除了分析自身滞后项的影响外,还分析其他相关因素的滞后项对未来值产生的影响参考 用来分析随机扰动对系统的动态冲击的大小 ...

  2. NG-ALAIN 边学边记2

    1. 下载Git上的源码  : https://github.com/ng-alain/ng-alain.git 2.解压文件: 3.进入到目录下: 4.打开CMD 切换到 E:\NgAlain\ng ...

  3. python pymysql 基本使用

    from pymysql import * # 1.创建连接数据库 conn = connect(host="localhost", port=3306, user="r ...

  4. 【NOIP2012普及组】寻宝

    这道实际难度入门的题做得真™要麻烦死我,由于摸不到电脑,在大脑里调了3天都翻不转!! P1076 寻宝 思路:暴力模拟(这是基础,单纯暴力据说会全部TLE)+取模优化(这样时间复杂度骤降到O(NM)) ...

  5. 路飞-Redis

    redis数据库 # 1.安装redis与可视化操作工具 # 2.在服务中管理redis服务器的开启关闭 # 3.命令行简单使用redis: -- redis-cli # 启动客户端 -- set k ...

  6. mp

    问题 G: Green Bin 时间限制: 1 Sec  内存限制: 128 MB[提交] [状态] 题目描述 We will call a string obtained by arranging ...

  7. ansible笔记(6):常用模块之系统模块

    1.cron模块 cron命令是计划任务功能,与crontab功能类似. 示例:时间格式--->>>分  时  日  月 星期 10 12 27 * *  tar -cvzf log ...

  8. MyBatis(2)——增删改查

    增删改查: 1.在实体类的映射文件中增加insert.update.delete标签与数据库语句,例如 <!-- 会去获取到对应的实体类的getter方法 --> <insert i ...

  9. app项目中遇到TCP分包,H5端对分包进行拼包

    之前有个需求,由于H5端不支持TCPSocket通信,于是中间搭了个安卓框架作为通信的介质,在开发中遇到一个问题,当后端传一个比较大的数据上来时,一条完整的数据会没有规矩的分成若干个包,每条数据可能不 ...

  10. CSP2019感想

    我觉得自己好弱啊. 想更新博客,可是又没有人看. 本来自己还不算太弱,可是自己越来越腐败. 看看自己,连更新博客的资本都没有了呢.别人写些什么都是经典干货.自己写什么自己都觉得垃圾,只好默默地删掉. ...