码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-04-06 11:30:06      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:深搜   stl   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),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;
} 



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

标签:深搜   stl   vector   

原文地址:http://blog.csdn.net/ice_alone/article/details/44900273

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!