虫洞
// 虫洞.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
/*
http://ybt.ssoier.cn:8088/problem_show.php?pid=1507
原题来自:USACO 2006 Dec. Gold,原文见 POJ 3259
John 在他的农场中闲逛时发现了许多虫洞。虫洞可以看作一条十分奇特的有向边,
并可以使你返回到过去的一个时刻(相对你进入虫洞之前)。
John 的每个农场有 M 条小路(无向边)连接着 N(从 1 到 N 标号)块地,并有 W 个虫洞。
现在 John 想借助这些虫洞来回到过去(在出发时刻之前回到出发点),请你告诉他能办到吗。
John 将向你提供 F 个农场的地图。没有小路会耗费你超过 104秒的时间,当然也没有虫洞回帮你回到超过 104 秒以前。
【输入】
第一行一个整数 F,表示农场个数;
对于每个农场:
第一行,三个整数 N,M,W;
接下来 M 行,每行三个数 S,E,T,表示在标号为 S 的地与标号为 E 的地中间有一条用时 T 秒的小路;
接下来 W 行,每行三个数 S,E,T,表示在标号为 S 的地与标号为 E 的地中间有一条可以使 John 到达 T 秒前的虫洞。
【输出】
输出共 F 行,如果 John 能在第 i 个农场实现他的目标,就在第 i 行输出 YES,否则输出 NO。
【输入样例】
2
3 3 1
1 2 2
1 3 4
2 3 1
3 1 3
3 2 1
1 2 3
2 3 4
3 1 8
【输出样例】
NO
YES
【提示】
数据范围:
对于全部数据,1≤F≤5,1≤N≤500,1≤M≤2500,1≤W≤200,1≤S,E≤N,∣T∣≤104 。
*/
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int N = 510;
const int M = 5410;
int h[N], e[M], ne[M], w[M], idx;
int n; // 总点数
int dist[N], cnt[N]; // dist[x]存储1号点到x的最短距离,cnt[x]存储1到x的最短路中经过的点数
bool st[N]; // 存储每个点是否在队列中
void add(int a, int b, int l) {
e[idx] = b, w[idx] = l, ne[idx] = h[a], h[a] = idx++;
}
bool spfa() {
queue<int> q;
for (int i = 1; i <= n; i++)
{
q.push(i);
st[i] = true;
}
while (q.size())
{
auto t = q.front();
q.pop();
st[t] = false;
for (int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
if (dist[j] > dist[t] + w[i])
{
dist[j] = dist[t] + w[i];
cnt[j] = cnt[t] + 1;
if (cnt[j] >= n) return true; // 如果从1号点到x的最短路中包含至少n个点(不包括自己),则说明存在环
if (!st[j])
{
q.push(j);
st[j] = true;
}
}
}
}
return false;
}
void solve() {
memset(h, -1, sizeof h); idx = 0;
memset(dist, 0, sizeof dist);
memset(cnt, 0, sizeof cnt);
memset(st, 0, sizeof st);
int m1, m2;
cin >> n >> m1 >> m2;
for (int i = 0; i < m1; i++) {
int a, b, l; cin >> a >> b >> l;
add(a, b, l); add(b, a, l);
}
for (int i = 0; i < m2; i++) {
int a, b, l; cin >> a >> b >> l;
add(a, b, -l);
}
if (spfa()) {
cout << "YES" << endl;
}
else {
cout << "NO" << endl;
}
return;
}
int main()
{
int T;cin >> T;
while (T--) {
solve();
}
return 0;
}
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
浙公网安备 33010602011771号