POJ 3259 http://poj.org/problem?id=3259

题意:

农夫 FJ 有 N 块田地【编号 1...n】 (1<=N<=500)

田地间有 M 条路径 【双向】(1<= M <= 2500)

同时有 W 个孔洞,可以回到以前的一个时间点【单向】(1<= W <=200)

问:FJ 是否能在田地中遇到以前的自己

算法:bellman_ford 判断是否有负环

思路:

田地间的双向路径加边,权值为正

孔洞间的单向路径加边,权值为负【可以回到以前】

判断有向图是否存在负环

因为如果存在了负数环,时间就会不停的减少,

那么 FJ 就可以回到以前更远的地方,肯定能遇到以前的自己的

bellman_ford

#ifndef ONLINE_JUDGE
#pragma warning(disalbe : 4996)
#endif
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 510;
const int maxw = 2500 * 2 + 200 + 10;
const int inf = 10000;
int d[maxn];
int n, m; struct Edge {
int u, v;
int t;
}edge[maxw]; bool bellman_ford() {
for (int i = 1; i <= n; ++i) d[i] = inf;
d[1] = 0;//起点定为0 for (int i = 1; i < n; ++i) {
bool flag = true;
for (int j = 0; j < m; ++j) {
int u = edge[j].u;
int v = edge[j].v;
int t = edge[j].t; if (d[v] > d[u] + t) {//松弛操作
d[v] = d[u] + t;
flag = false;
}
}
if (flag) return false;//如果当前轮不能松弛,直接判断没有负数环
} for (int i = 0; i < m; ++i)
if (d[edge[i].v] > d[edge[i].u] + edge[i].t)
return true;//如果仍然能够松弛则存在负环 return false;
} int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif // !ONLINE_JUDGE
int T;
int M, W;
scanf("%d", &T);
while (T--)
{
scanf("%d%d%d", &n, &M, &W);
m = 0; int u, v, t;
for (int i = 1; i <= M; i++) //田地间的大路,加双边
{
scanf("%d%d%d", &u, &v, &t);
edge[m].u = u;
edge[m].v = v;
edge[m++].t = t; edge[m].u = v;
edge[m].v = u;
edge[m++].t = t;
} for (int i = 1; i <= W; i++) //孔洞,加单边
{
scanf("%d%d%d", &u, &v, &t);
edge[m].u = u;
edge[m].v = v;
edge[m++].t = -t;
} if (bellman_ford()) printf("YES\n"); //存在负数环
else printf("NO\n");
}
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
system("out.txt");
#endif // !ONLINE_JUDGE
return 0;
}

Floyd

#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
using namespace std; int n, m, W;//教室、普通走廊、回溯
const int inf = 0x3f3f3f3f, maxn = 510;
int g[maxn][maxn]; bool floyd() {
for (int k = 1; k <= n; ++k)
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j)
if (g[i][j] > g[i][k] + g[k][j])
g[i][j] = g[i][k] + g[k][j];
if (g[i][i] < 0)return true;//存在负环
}
return false;
} int main() {
//freopen("in.txt","r",stdin);
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t; cin >> t; while (t--) {
cin >> n >> m >> W;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
g[i][j] = inf;
for (int i = 0; i <= n; ++i)g[i][i] = 0; int u, v, w;
for (int i = 0; i < m; ++i)
cin >> u >> v >> w, g[u][v] = g[v][u] = min(g[u][v],w);
for (int i = 0; i < W; ++i)
cin >> u >> v >> w, g[u][v] = -w;
cout << (floyd() ? "YES" : "NO" )<< endl; }
}

SPFA

//kuangbin 的板子确实挺漂亮的
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
int n;
const int MAXN = 505, INF = 0x3f3f3f3f;
struct Edge {
int v;
int cost;
Edge(int _v = 0, int _cost = 0) : v(_v), cost(_cost) {}
};
vector<Edge> E[MAXN];
void addedge(int u, int v, int w) {
E[u].push_back(Edge(v, w));
} bool vis[MAXN];
int cnt[MAXN];
int dist[MAXN]; bool SPFA(int start) {
memset(vis, false, sizeof vis);
memset(cnt, 0, sizeof cnt);
memset(dist, INF, sizeof dist);
queue<int> que;
que.push(start);
++cnt[start];
dist[start] = 0;
while (!que.empty()) {
int u = que.front(); que.pop();
vis[u] = false;
for (int i = 0; i < E[u].size(); ++i) {
int v = E[u][i].v;
if (dist[v] > dist[u] + E[u][i].cost) {
dist[v] = dist[u] + E[u][i].cost;
if (!vis[v]) {
vis[v] = true;
que.push(v);
if (++cnt[v] > n) return true;
}
}
}
}
return false;
} int main() {
int f, m, W;
scanf("%d", &f);
while (f--) {
scanf("%d%d%d", &n, &m, &W);
int u, v, w;
for (int i = 0; i < m; ++i) {
scanf("%d%d%d", &u, &v, &w);
addedge(u, v, w);
addedge(v, u, w);
}
for (int i = 0; i < W; ++i) {
scanf("%d%d%d", &u, &v, &w);
addedge(u, v, -w);
} printf("%s\n", SPFA(1) ? "YES" : "NO");
for (int i = 1; i <= n; ++i)
E[i].clear();
}
return 0;
}

三种方法AC以后发现BF竟然时间最短

POJ 3259 Wormholes(bellman_ford、Floyd、SPFA判断负环)的更多相关文章

  1. 解题报告:poj 3259 Wormholes(入门spfa判断负环)

    Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes ...

  2. POJ 3259 Wormholes(最短路径,求负环)

    POJ 3259 Wormholes(最短路径,求负环) Description While exploring his many farms, Farmer John has discovered ...

  3. POJ 3259 Wormholes【最短路/SPFA判断负环模板】

    农夫约翰在探索他的许多农场,发现了一些惊人的虫洞.虫洞是很奇特的,因为它是一个单向通道,可让你进入虫洞的前达到目的地!他的N(1≤N≤500)个农场被编号为1..N,之间有M(1≤M≤2500)条路径 ...

  4. POJ 3259 Wormholes ( SPFA判断负环 && 思维 )

    题意 : 给出 N 个点,以及 M 条双向路,每一条路的权值代表你在这条路上到达终点需要那么时间,接下来给出 W 个虫洞,虫洞给出的形式为 A B C 代表能将你从 A 送到 B 点,并且回到 C 个 ...

  5. Wormholes POJ - 3259 spfa判断负环

    //判断负环 dist初始化为正无穷 //正环 负无穷 #include<iostream> #include<cstring> #include<queue> # ...

  6. POJ3259 Wormholes(SPFA判断负环)

    Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes ...

  7. Wormholes---poj3259(最短路 spfa 判断负环 模板)

    题目链接:http://poj.org/problem?id=3259 题意是问是否能通过虫洞回到过去: 虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts. 我们把虫洞看成是一条负权路,问 ...

  8. [APIO2017]商旅——分数优化+floyd+SPFA判负环+二分答案

    题目链接: [APIO2017]商旅 枚举任意两个点$(s,t)$,求出在$s$买入一个物品并在$t$卖出的最大收益. 新建一条从$s$到$t$的边,边权为最大收益,长度为原图从$s$到$t$的最短路 ...

  9. spfa判断负环

    会了spfa这么长时间竟然不会判断负环,今天刚回.. [例题]poj3259 题目大意:当农场主 John 在开垦他的农场时,他发现了许多奇怪的昆虫洞.这些昆虫洞是单向的,并且可以把你从入口送到出口, ...

  10. spfa 判断负环 (转载)

    当然,对于Spfa判负环,实际上还有优化:就是把判断单个点的入队次数大于n改为:如果总的点入队次数大于所有点两倍 时有负环,或者单个点的入队次数大于sqrt(点数)有负环.这样时间复杂度就降了很多了. ...

随机推荐

  1. 实例讲解SpringBoot集成Dubbo的步骤及过程

    首先,让我们先了解一下Spring Boot和Dubbo. Spring Boot 是一个开源的 Java Web 框架,它可以帮助开发者快速创建独立的.生产级别的 Spring 应用程序.Sprin ...

  2. 超实用:通过文字就可以操纵这款AI表格

    公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 工具介绍 今天给大家分享超实用的AI表格ChatExcel,这个工具是由北大团队在2022年3月开始开发的AI表格处理神器 ...

  3. 功能不够,SQL来凑,修改数据库的正确姿势?

    修改数据库是一项关键任务,需要小心谨慎地执行,以确保数据的完整性和准确性.下面是一个详细的步骤指南,介绍了正确修改数据库的姿势. 第一步:备份数据库 在进行任何数据库修改之前,务必备份数据库.这样,如 ...

  4. # [AI]多模态聚类能力助力AI完成自主意识测试

    引言 探讨人工智能是否能形成自我意识,是一个当前AI领域一个重要而又复杂的问题.随着深度学习和强化学习技术的不断进步,计算机在视觉识别.语音识别和控制机器人等方面都已取得长足的进展,模拟和超越人类的一 ...

  5. 如何在Web应用中添加一个JavaScript Excel查看器

    前言 在现代的Web应用开发中,Excel文件的处理和展示是一项常见的需求.为了提供更好的用户体验和功能,经常需要在Web应用中添加一个JavaScript Excel查看器,小编今天将为大家展示如何 ...

  6. 【Linux API 揭秘】container_of函数详解

    [Linux API 揭秘]container_of函数详解 Linux Version:6.6 Author:Donge Github:linux-api-insides 1.container_o ...

  7. 太牛叉了!国产 AI 智能体惊艳问世,全面致敬 FastGPT!

    太震撼了!太厉害了!昆仑万维正式发布了「天工 SkyAgents」平台,助力大模型走入千家万户.你听听,这个名字一听就有一种巧夺天工的感觉,技艺那是相当的高超. 这个平台基于昆仑万维「天工大模型」打造 ...

  8. 记一次 .NET某工控 宇宙射线 导致程序崩溃分析

    一:背景 1. 讲故事 为什么要提 宇宙射线, 太阳耀斑 导致的程序崩溃呢?主要是昨天在知乎上看了这篇文章:莫非我遇到了传说中的bug? ,由于 rip 中的0x41变成了0x61出现了bit位翻转导 ...

  9. python 获取android 应用使用情况

    python 获取android 应用使用情况 本文主要讲述python 脚本获取android 应用使用情况. 主要思路:使用adb 获取当前activity ,1s 一次输出. 主要涉及知识点: ...

  10. 自定义md-loader来简单高效的维护组件文档

    个人觉得,组件库最难的不是开发,而是使用,怎么才能让组内同事都用起来,这才是关键 背景 虽然现在开源的组件库很多,但每个项目里还是或多或少都会有人封装出一些项目内通用的基础组件.业务组件 我参与过多个 ...