2021-2022 ICPC, NERC, Northern Eurasia Onsite Problem-L. Labyrinth

2023-11-11 16:30

本文主要是介绍2021-2022 ICPC, NERC, Northern Eurasia Onsite Problem-L. Labyrinth,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

可能是今年我写的最漂亮的一题(毕竟蒟蒻A大题

传送门:Problem - L - Codeforces (Unofficial mirror site, accelerated for Chinese users)

题意:有向图,两个人从出发点开始从两条不同的路走到终点,出发点给定,终点任选(除出发点外)。

注意:可能成环!可能非连通图!(写着写着把成环忘了,RE两发血亏TAT)

/*样例
输入
5 5 1
1 2
2 3
1 4
4 3
3 5
输出
Possible
3
1 2 3
3
1 4 3输入
5 5 1
1 2
2 3
3 4
2 5
5 4
输出
Impossible输入
3 3 2
1 2
2 3
3 1
输出
Impossible*/

我的做法是记忆化深搜(自己取名装高手

思路很简单,从指定出发点开始,对出发点能一步到达的所有顶点深搜,要是其中存在两次深搜在某个点碰头了,就说明有路径(Possible),否则没有。

嗯很清晰的思路,但是有点难写呢~

考虑这样使用vis数组,每次深搜把路径上每个点u的vis[u]赋予出发点si(好像没说清,就是vis[u]=si),那深搜的细节操作就很明晰了

  1. 当vis[u]为0时,说明没探索过这个点,给vis[u]赋si,return 0
  2. 当vis[u]为本次深搜的出发点时(vis[u] && vis[u] == si),说明发现环了,return 0
  3. 当vis[u]不为0,且不等于本次深搜的出发点时(vis[u] && vis[u] != si),说明发现与之前某次深搜碰头了,咱们先输出这次深搜记录的路径(ans),然后返回碰头的节点,以便通过vis找与本次深搜碰头的那次深搜的出发点
#include<bits/stdc++.h>
using namespace std;
const int maxe = 2e5+100;
int cnt;
struct node{int to, next;
}edge[maxe];int head[maxe], vis[maxe];vector<int> ans;void add(int u,int v){edge[++cnt].to = v;edge[cnt].next = head[u];head[u] = cnt;
}
int an, s;
int dfs(int u, int v, int si){if(u == s) return 0;if(vis[u] && vis[u] != si){if(an == 0){printf("Possible\n");an++;}printf("%d\n", ans.size() + 2);for(int i = 0; i < ans.size(); i++){printf("%d ", ans[i]);}printf("%d %d\n", v, u);return u;}if(vis[u]&&vis[u]==si) return 0;vis[u] = si;int f = 0;for(int i = head[u]; i; i = edge[i].next) {ans.push_back(v);f = dfs(edge[i].to, u, si);ans.pop_back();if(f) return f;}return 0;
}
int main(){int n,m;scanf("%d%d%d", &n, &m, &s);for(int i = 1; i <= m; i++){int a,b;scanf("%d%d", &a, &b);add(a, b);}int f=0, ff=0;for(int i=head[s];i;i=edge[i].next){f = dfs(edge[i].to, s, edge[i].to);if(f){ff = edge[i].to;break;}}if(f){int tmp = vis[f];for(int i=1;i<=n;i++) vis[i] = 0;vis[f] = ff;f = tmp;dfs(f, s, f);}else{printf("Impossible");}return 0;
}

最后夸夸队友一发没WA,希望EC也能做个两题\doge

 

这篇关于2021-2022 ICPC, NERC, Northern Eurasia Onsite Problem-L. Labyrinth的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/391374

相关文章

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro

2021-8-14 react笔记-2 创建组件 基本用法

1、目录解析 public中的index.html为入口文件 src目录中文件很乱,先整理文件夹。 新建components 放组件 新建assets放资源   ->/images      ->/css 把乱的文件放进去  修改App.js 根组件和index.js入口文件中的引入路径 2、新建组件 在components文件夹中新建[Name].js文件 //组件名首字母大写

2021-08-14 react笔记-1 安装、环境搭建、创建项目

1、环境 1、安装nodejs 2.安装react脚手架工具 //  cnpm install -g create-react-app 全局安装 2、创建项目 create-react-app [项目名称] 3、运行项目 npm strat  //cd到项目文件夹    进入这个页面  代表运行成功  4、打包 npm run build

[SWPUCTF 2021 新生赛]web方向(一到六题) 解题思路,实操解析,解题软件使用,解题方法教程

题目来源 NSSCTF | 在线CTF平台因为热爱,所以长远!NSSCTF平台秉承着开放、自由、共享的精神,欢迎每一个CTFer使用。https://www.nssctf.cn/problem   [SWPUCTF 2021 新生赛]gift_F12 这个题目简单打开后是一个网页  我们一般按F12或者是右键查看源代码。接着我们点击ctrl+f后快速查找,根据题目给的格式我们搜索c

2014年ACM/ICPC亚洲区现场赛广州赛区总结

本来不想提这件事的,后来学姐找我谈心时提到这件事,我突然意识到在这件事情上我错了一次,明明答应的去参加这场比赛,最后临时决定不去......其实中间有很多很多原因 1:我和tyh,sxk临时不去主要是广州太远,我们身上money不够,呵呵。。。别笑我们,你以为我们是高富帅啊,去一趟广州消费要2个月的生活费,奖学金又没发,你让我找我妈要她辛辛苦苦挣来的工资吗?!从哈尔滨到广州单来回的火车票每个人就

11991 - Easy Problem from Rujia Liu?

题意: 输入一串整型数列,再输入两个数k,v,输出第k个v的序号。不存在则输出0,如第一个样例 8 41 3 2 2 4 3 2 11 3 //第1个3,序号为2,输出22 4 //第2个4,不存在,输出03 2 //第3个2,序号为7,输出74 2 思路: struct num {

上海大学《2022年836+915自动控制原理真题及答案》 (完整版)

Part1:2022年上海大学真题题目 学硕836 专硕915 Part2:2022年上海大学真题答案 学硕836 专硕915

【算法 2022】高效有用的机器学习算法和 Python 库

2022年已经到来,在此祝大家虎年大吉!2022年,下面几种机器学习算法和 Python 库将在未来更受欢迎!让我们花个几分钟一起来了解下: 一、CatBoost CatBoost 可能是最新的算法,因为它随着越来越流行而不断更新。这个机器学习算法对于处理分类数据的数据科学家特别有用。您可以考虑 Random Forest 和 XGBoost 算法的优点,CatBoost 具有它们的大部分优点