深搜 邻接表 nyoj 20 吝啬的国度

吝啬的国度

时间限制:1000 ms  |  内存限制:65535 KB

难度:3

描述
在一个吝啬的国度里有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
来源
经典题目
上传者

张云聪

思路:将无向图变为有向树的过程!用邻接矩阵 会超时!用vector

代码如下:

#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
int n,s;
int fa[100100];
//vector<vector <int > >g(100100,vector<int>());
//vector<vector <int > >g(100100);
vector<int > g[100100];//最省时
void dfs(int u,int father)
{
	int i,j,v;
	int len=g[u].size();
	for(i=0;i<len;++i)
	{
		v=g[u][i];
		if(v!=father)// 没有回溯到根结点
		{
			fa[v]=u;
			dfs(v,u);
		}
	}
}
int main()
{
	int t;
	int u,v;
	int i,j;
	scanf("%d",&t);
	while(t--)
	{
		for(i=1;i<100100;++i)
		g[i].clear();//此处用 g.clear一直re...-_-||
		memset(fa,0,sizeof(fa));
		scanf("%d%d",&n,&s);
		for(i=1;i<n;++i)
		{
			scanf("%d%d",&u,&v);
			g[u].push_back(v);
			g[v].push_back(u);
		}
		fa[s]=-1;
		dfs(s,-1);
		for(i=1;i<=n;++i)
		{
			if(i==1)
			printf("%d",fa[i]);
			else
			printf(" %d",fa[i]);
		}
		puts("");
	}
	return 0;
} 

更省时的。。代码

//法二 :

#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
int n,s;
int fa[100100];
vector <int >g[100100];
void dfs(int u)
{
	int i,d=g[u].size();
	for(i=0;i<d;++i)
	{
		if(fa[g[u][i]])//有父节点,继续下一个节点
		continue;
		fa[g[u][i]]=u;
		dfs(g[u][i]);
	}
}
int main()
{
	int t;
	int i,j,u,v;
	scanf("%d",&t);
	while(t--)
	{
		memset(fa,0,sizeof(fa));//此处也是不同的
		memset(g,0,sizeof(g));
		scanf("%d%d",&n,&s);
		for(i=1;i<n;++i)
		{
			scanf("%d%d",&u,&v);
			g[u].push_back(v);
			g[v].push_back(u);
		}
		fa[s]=-1;
		dfs(s);
		for(i=1;i<=n;++i)
		{
			if(i==1)
			printf("%d",fa[i]);
			else
			printf(" %d",fa[i]);
		}
		puts("");
	}
	return 0;
} 
时间: 2024-12-28 23:06:42

深搜 邻接表 nyoj 20 吝啬的国度的相关文章

Nyoj 20 吝啬的国度(dfs)

吝啬的国度 时间限制:1000 ms  |            内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路). 输入 第一行输入一个整数M表示测试数据共有M(1<=M<=5)组 每组测试数据的第一行输入一个正整数N(1<=N<=100000)和一个正整数S(1<=S&

NYOJ 20 吝啬的国度 【BFS+链式前向星建图,Vector建图】

吝啬的国度 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路). 输入 第一行输入一个整数M表示测试数据共有M(1<=M<=5)组 每组测试数据的第一行输入一个正整数N(1<=N<=100000)和一个正整数S(1<=S<=100000

HDU-1016 Prime Ring Problem(DFS深搜+打表)

题目回顾(HDU-1016): Prime Ring Problem Problem Description A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.Note: the number

NYOJ题目20吝啬的国度

-----------------------------------------n-1条边的无向连通图是一棵树,又因为树上两点之间的路径是唯一的,所以解是唯一的.(注意并不一定是二叉树,所以最好采用存储图的方式存储数,我使用的是邻接表)这个时候只需要考虑如何求解两点间的路径呢?遍历就可以了.但是应该如何遍历呢?比较容易想到的办法是分别从每个点计算到S点的路径,既然它们的终点相同,那为什么不逆向一下干脆从S点向这些点出发呢?所以现在问题就转化为了从S点出发遍历树,OK,这个问题就比较简单了,只需

nyoj 题目20 吝啬的国度

吝啬的国度 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路). 输入 第一行输入一个整数M表示测试数据共有M(1<=M<=5)组每组测试数据的第一行输入一个正整数N(1<=N<=100000)和一个正整数S(1<=S<=100000)

nyist 20 吝啬的国度(dfs)

吝啬的国度 题目描述: 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来. 现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市, 必须经过的前一个城市是几号城市(假设你不走重复的路). 输入: 第一行输入一个整数M表示测试数据共有M(1<=M<=5)组 每组测试数据的第一行输入一个正整数N(1<=N<=100000)和一个正整数S(1<=S<=100000),  N表示城市的总个数,S表示参观者所在城市的编号 随后

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行,每行有两个正整数

hpu 1713 参观城市 &lt;bfs+邻接表&gt;

1713: 参观城市 时间限制: 1 Sec  内存限制: 128 MB 提交: 35  解决: 20 [提交][状态][讨论版] 题目描述 有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,小明在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路). 输入 第一行输入一个整数M表示测试数据共有M(1<=M<=5)组 每组测试数据的第一行输入一个正整数N(1<=N<=100000)和一个正整数S(1&

NYoj 素数环(深搜入门)

题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=488 深搜模板: 1 void dfs(int 当前状态) 2 { 3 if(当前状态为边界状态) 4 { 5 记录或输出 6 return; 7 } 8 for(i=0;i<n;i++) //横向遍历解答树所有子节点 9 { 10 //扩展出一个子状态. 11 修改了全局变量 12 if(子状态满足约束条件) 13 { 14 dfs(子状态) 15 } 16 恢复全局变量//回