虫洞问题(最短路)

news/2024/10/18 7:56:05/

在探索他的许多农场时,农夫约翰发现了许多惊人的虫洞。虫洞非常奇特,因为它是一条单行道,在你进入虫洞之前的时间将你送到目的地!FJ的每个农场都包括N(1≤N≤500)田地,编号为1。NM(1 ≤ M ≤ 2500)路径和W(1 ≤ W ≤200)虫洞。

由于FJ是一个狂热的时间旅行爱好者,他想做以下事情:从某个场地开始,穿过一些路径和虫洞,并在他最初离开之前的时间返回起跑场。也许他能够:)见到自己。

为了帮助FJ了解这是否可能,他将为您提供其农场F(1 ≤ F ≤ 5)的完整地图。任何路径都不会花费超过10,000秒的时间来行驶,也没有虫洞可以将FJ带回超过10,000秒的时间。

ac代码

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define MAXN 100010
using namespace std;
const int inf = 0x3f3f3f3f;
int n, m, w;
int head[MAXN], ed[MAXN], val[MAXN], nex[MAXN], idx;
int dist[MAXN], vis[MAXN], cnt[MAXN];
void add(int x, int y, int z) {//链式前向星储路径ed[idx] = y;val[idx] = z;nex[idx] = head[x];head[x] = idx++;
}
int spfa()
{int i;memset(dist, 0x3f, sizeof(dist));//初始化距离为无穷大memset(vis, 0, sizeof(vis));//队列中标记为1,不在队列中为0memset(cnt, 0, sizeof(cnt));//表示当前点到起点最短路的边数,初始化为0个;queue<int> q;//队列for (i = 1; i <= n; i++){vis[i] = 1;//准备放入队列,标记q.push(i);//把所有点作为初始点塞进队列}while (q.size() > 0) {//几乎就是spfa算法了。int temp = q.front();q.pop();vis[temp] = 0;for (int i = head[temp]; i != -1; i = nex[i]) {if (dist[ed[i]] > dist[temp] + val[i]) {dist[ed[i]] = dist[temp] + val[i];cnt[ed[i]] = cnt[temp] + 1;if (cnt[ed[i]] >= n)return 1;if (vis[ed[i]] == 0) {q.push(ed[i]);vis[ed[i]] = 1;}}}}return 0;
}int main() {int t;scanf("%d", &t);while (t--){memset(head, -1, sizeof(head));scanf("%d %d %d", &n, &m, &w);for (int i = 1; i <= m; i++) {int x, y, z;scanf("%d %d %d", &x, &y, &z);add(x, y, z);add(y, x, z);//双向}for (int i = 1; i <= w; i++){int x, y, z;scanf("%d %d %d", &x, &y, &z);add(x, y, -z);//虫洞是回溯时间,z为-的;}int res = spfa();if (res == 1)printf("YES\n");//有一次还把大小写看错了,啊这else printf("NO\n");}return 0;
}

 这里呢,我再展示下我的超时代码,ac代码思路是受大佬启发的,下面代码是我最初的想法。

#include<iostream>//超时代码
#include<cstring>
#include<algorithm>
#include<queue>#define MAXN 100010using namespace std;const int inf = 0x3f3f3f3f;
int n, m,w;
int head[MAXN], ed[MAXN], val[MAXN], nex[MAXN], idx;
int dist[MAXN], vis[MAXN], cnt[MAXN];void add(int x, int y, int z) {ed[idx] = y;val[idx] = z;nex[idx] = head[x];head[x] = idx++;
}int spfa() {int i;for (i = 1; i <= n; i++)、、(是我心存侥幸了){int start = i;memset(dist, 0x3f, sizeof(dist));memset(vis, 0, sizeof(vis));memset(cnt, 0, sizeof(cnt));dist[start] = 0;vis[start] = 1;queue<int> q;q.push(start);while (q.size() > 0) {int temp = q.front();q.pop();vis[temp] = 0;for (int i = head[temp]; i != -1; i = nex[i]) {if (dist[ed[i]] > dist[temp] + val[i]) {dist[ed[i]] = dist[temp] + val[i];cnt[ed[i]] = cnt[temp] + 1;if (cnt[ed[i]] >= n)return 1;if (vis[ed[i]] == 0) {q.push(ed[i]);vis[ed[i]] = 1;}}}}}return 0;
}int main() {int t;scanf("%d", &t);while (t--){memset(head, -1, sizeof(head));scanf("%d %d %d", &n, &m, &w); for (int i = 1; i <= m; i++) {int x, y, z;scanf("%d %d %d", &x, &y, &z);add(x, y, z);add(y, x, z);}for (int i = 1; i <= w; i++){int x, y, z;scanf("%d %d %d", &x, &y, &z);add(x, y, -z);}int res = spfa();if (res == 1)printf("YES\n");else printf("NO\n");}return 0;
}


http://www.ppmy.cn/news/798575.html

相关文章

DP(01背包)——采药

#include<bits/stdc.h> using namespace std; const int N1010; int dp[N]; int main() {int T,M;cin>>T>>M;for(int i1;i<M;i){int t,v;cin>>t>>v;for(int jT;j>t;j--)dp[j]max(dp[j],dp[j-t]v);}cout<<dp[T];return 0; }

打洞,,

UDP,TCP打洞技术 内容概述&#xff1a;在p2p通信领域中&#xff0c;由NAT(Network Address Translation&#xff0c;网络地址转换)引起的问题已经众所周知了,它会导致在NAT内部的p2p客户端在无论以何种有效的公网ip都无法访问的问题。虽然目前已经发展出多种穿越NAT的技术,但相…

神奇的口袋--刚好装满背包的方法总数

描述 题目描述 有一个神奇的口袋&#xff0c;总的容积是40&#xff0c;用这个口袋可以变出一些物品&#xff0c;这些物品的总体积必须是40。John现在有n个想要得到的物品&#xff0c;每个物品的体积分别是a1&#xff0c;a2……an。John可以从这些物品中选择一些&#xff0c;如…

白天做安全,晚上去挖洞

聚焦源代码安全&#xff0c;网罗国内外最新资讯&#xff01; 编译&#xff1a;奇安信代码卫士团队 今天带来的是Kaung Htete Aung (ris) 和 Samuel Eng (samengmg) 的故事。他们来自新加坡&#xff0c;白天在顶级技术公司当全职安全工程师&#xff0c;业余时候在挖洞。数百名白…

昆虫洞

昆虫洞 Problem Description 当农场主John在开垦他的农场时&#xff0c;发现了许多奇怪的昆虫洞。这些昆虫洞是单向的&#xff0c;并且可以从入口到出口&#xff0c;并且使得时间倒退一段。John的每个农场包含N(1≤N≤500)块地&#xff0c;编号从1~N&#xff0c;这N快地之间有M…

快速挖掘设备逻辑洞方法分享

转载&#xff1a;https://www.cnblogs.com/pwnfeifei/p/17369551.html 前言 接触iot也快有一年的时间了&#xff0c;一年来也挖掘了大大小小几十个洞&#xff0c;虽然能有些产出但是却逐渐对人工审计感到无趣和疲惫。在此之间我也尝试过通过使用污点分析&#xff0c;fuzz等方…

那年那日那些洞

前言 此文库主要是记录一年来一些有趣的漏洞&#xff0c;拿出来给大家分享一下&#xff0c;仅供学习参考&#xff0c;禁止对任何未授权的网站进行实操。 此系列会持续更新~~~也欢迎大家投稿&#xff01;&#xff01; 1.命令执行 不说废话直接上图&#xff0c;这是一个iot的…

【社会实践】红旗渠:青年洞

“闪闪红星“社会实践团队活动简报——2019年11月10日 第二天&#xff0c;河南工业大学闪闪红星社会实践团队来到了红旗渠总干渠主要工程之一的青年洞。下车后&#xff0c;首先映入眼帘的就是青年洞主入口标志性建筑红飘带——廊桥。廊桥的整体形态犹如山间舞动的红飘带&#x…