【C++ 图论】虫洞Wormholes

这篇博客探讨了如何使用C++处理图论中的负环问题,特别是在需要回到起点时路径变为负数的场景。文章介绍了输入解析,重点讨论了三种用于判断负环的算法:SPFA、Bellman-Ford和Floyd。通过分析,指出在特定数据范围内,这三种算法都适用。同时,提供了SPFA的简洁实现,强调了处理重边的注意事项,并提到正确做法需要先进行DFS染色再进行SPFA。最后,提到Bellman-Ford与SPFA的关系,认为SPFA是对Bellman-Ford的优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


题意简介

因为要回到过去,所以回到起点时是一个负数。所以,就是求负环的问题了。

输入浅析

输入,就是说,有很多无向边,还有一些虫洞在单向边上,这些单向边为负权。

算法分析

算法的话,判负环有3 kinds of algorithm : SPFA, Bellman-Ford and Floyd。看这道题的神奇数据范围,三种是都可以用的。

等一下,不是多源负环吗?怎么能用SPFA呢?不要急,等一下再说。

Floyd

老师:在循环体足够简单的情况下, O ( 50 0 3 ) O(500^3) O(5003)是可以过的…… 看来老师很擅长卡常+O2啊

因为代码极简单,直接看吧。

还有,记住,有重边……

// luogu-judger-enable-o2
#include<cstdio>
#include<cstring>
#define reg register
#define ONLINE_JUDGE
#ifdef ONLINE_JUDGE
char buf[1 << 21], *p1 = buf, *p2 = buf;
inline int getc() {
   
   
    return p1 == p2 && (++p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++;
}
#define getchar getc
#endif
template <typename T>
inline T read() {
   
   
    T a = 0; char c = getchar(), f = 1;
    while(c < '0' || c > '9') {
   
   
        if(c == '-') f = -f;
        if(c == -1) return c;
        c = getchar();
    }
    while(c >= '0' && c <= '9') a = (a << 1) + (a << 3) + (c ^ 48), c = getchar();
    return a * f;
}
template <class T>
inline T Min(T a, T b) {
   
    return a < b ? a : b; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值