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;
} 原文地址:http://blog.csdn.net/ice_alone/article/details/44900273