NYOJ 20 吝啬的国度 (搜索)
吝啬的国度
- 描述
-
在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来。现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路)。
- 输入
-
第一行输入一个整数M表示测试数据共有M(1<=M<=5)组
每组测试数据的第一行输入一个正整数N(1<=N<=100000)和一个正整数S(1<=S<=100000),N表示城市的总个数,S表示参观者所在城市的编号
随后的N-1行,每行有两个正整数a,b(1<=a,b<=N),表示第a号城市和第b号城市之间有一条路连通。 - 输出
- 每组测试数据输N个正整数,其中,第i个数表示从S走到i号城市,必须要经过的上一个城市的编号。(其中i=S时,请输出-1)
- 样例输入
-
1 10 1 1 9 1 8 8 10 10 3 8 6 1 2 10 4 9 5 3 7
- 样例输出
-
-1 1 10 10 9 8 3 1 1 8
前两天刚学过图论中的最短路,今天做这道题,首先想到了用最短路的思想做。写了一个Bellman-Ford,超时了,原因是顶点数*边数太大。然后用广搜写了一下,AC。存储边时用了vector,记得每次都要清空vector。
#include<stdio.h> #include<string.h> #include<vector> #include<queue> using namespace std; const int N = 100010; int pre[N], vis[N], n, s; vector<int> vec[N]; void Init() {for(int i = 1; i <= n; i++)pre[i] = i, vis[i] = 0;pre[s] = -1; } void bfs() {queue<int> Q;Q.push(s);while(!Q.empty()){int t = Q.front();Q.pop();if(vis[t])continue;vis[t] = 1;for(int i = 0; i < vec[t].size(); i++){int p = vec[t][i];if(!vis[p]){pre[p] = t;Q.push(p);}}} } int main() {int t, i;scanf("%d",&t);while(t--){memset(vec, 0, sizeof(vec));scanf("%d%d",&n,&s);int a, b;for(i = 0; i < n - 1; i++){scanf("%d%d",&a,&b);vec[a].push_back(b);vec[b].push_back(a);}Init();bfs();printf("%d",pre[1]);for(i = 2; i <= n; i++)printf(" %d",pre[i]);printf("\n");}return 0; }
后来看讨论区,出题人说是把无根树转化为有根树,仔细一想,还真是。下面是代码:
/*无根树转有根树,s即为根*/ #include<stdio.h> #include<string.h> #include<vector> using namespace std; const int N = 100010; int pre[N], n, s; vector<int> vec[N]; void Init() {for(int i = 1; i <= n; i++)pre[i] = i;pre[s] = -1; } void dfs(int u, int fa) {int k = vec[u].size();for(int i = 0; i < k; i++){int v = vec[u][i];if(v != fa){pre[v] = u;dfs(v, u);}} } int main() {int t, i;scanf("%d",&t);while(t--){memset(vec, 0, sizeof(vec));scanf("%d%d",&n,&s);int a, b;for(i = 0; i < n - 1; i++){scanf("%d%d",&a,&b);vec[a].push_back(b);vec[b].push_back(a);}Init();dfs(s,-1); //从根节点开始搜printf("%d",pre[1]);for(i = 2; i <= n; i++)printf(" %d",pre[i]);printf("\n");}return 0; }
NYOJ 20 吝啬的国度 (搜索)相关推荐
- NYOJ 20 吝啬的国度 广度优先搜索
吝啬的国度 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有 ...
- NYOJ 20 吝啬的国度
吝啬的国度 时间限制: 1000 ms | 内存限制: 65535 KB 难度: 3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市 ...
- NYOJ 20 吝啬的国度(深搜)
描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设 ...
- NYOJ 20 吝啬的国度(深搜)
描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设 ...
- NYOJ 20 吝啬的国度 续
还是<吝啬的国度>,研读了别人的较为高效的代码,无论是时间开销,还是空间开销都要小很多啊,截图为证: 我的所有运行: 52ms的是我参照别人的写的代码,时间开销比我的小将近一半,内存开销仅 ...
- 《图论》— NYOJ 20 吝啬的国度
吝啬的国度 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有 ...
- 题目20: 吝啬的国度
吝啬的国度 时间限制: 1000 ms | 内存限制: 65535 KB 难度: 3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市 ...
- NOJ 20 吝啬的国度
开始做深搜的题,这是一种比较常见的递归,就是直接看去的点是从那来的,标记一下避免重复搜. 深搜的注意个人认为,1,要在一定范围内一般是在递归在1e4的范围内: 2,就是要注意标记,不然也可能导致超时的 ...
- 小白算法练习 NYOJ 吝啬的国度 dfs+邻接表
吝啬的国度 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有 ...
最新文章
- MahApps.Metro
- 掌握这 7 个编程设计原则,想做菜鸟都难
- 站点某些网页想显示母版页内的用户控件,某些网页不想显示,怎样实现
- Cloud Foundry技术资料汇总
- 开课吧怎么样_开课吧数据产品经理课程包括什么?开课吧培训的怎么样
- 盘点2020国内本科开设人工智能专业高校
- git 服务器搭建,在自己服务器上搭建私有仓库
- 踩不出足迹(牛客练习赛88 )
- maven异常001---报错The folder is already a source folder.的解决办法
- idea解决lombok注解失效问题
- ubuntu 开启dhcp服务并配置
- c#语法复习总结(1)-浅谈c#.net
- SuperWebSocket发布0.1版本
- 【转】《从入门到精通云服务器》第三讲-配置与升级云服务器
- Linux虚拟文件系统之文件打开(sys_open())
- 将CDlinux 0.9.7.1的iso安装到U盘并安装grub2
- 华侨大学计算机等级,全国计算机等级考试报名系统-华侨大学.doc
- 验证哥德巴赫猜想(函数专题)
- 敏捷开发:编写开发文档的利与弊
- 无懈可击 css html5,无懈可击的Web设计(第3版) 带目录书签完整pdf[80MB]