题目20 吝啬的国度 (DFS)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=20
首先这题看出是个图的生成树,用pre数组记录下父节点的值,深搜即可,深搜过程中记录父节点位置。
由于节点树较多,这里采用C++ STL中的vector容器来存储图。
1 #include<stdio.h> 2 #include<vector> 3 #include<string.h> 4 #include<stdlib.h> 5 6 using namespace std; 7 8 int pre[100005]; 9 vector <int> v[100005]; 10 11 void dfs(int x) 12 { 13 for(int i=0;i<v[x].size();i++) 14 { 15 if(!pre[v[x][i]]) //如果父节点未被记录过 16 { 17 pre[v[x][i]]=x; //记录父节点位置 18 dfs(v[x][i]); //沿路深搜 19 } 20 } 21 } 22 23 int main() 24 { 25 int T,x,y,N,s; 26 scanf("%d",&T); 27 while(T--) 28 { 29 memset(v,0,sizeof(v)); 30 memset(pre,0,sizeof(pre)); 31 scanf("%d%d",&N,&s); 32 pre[s]=-1; //起点父节点为-1 33 for(int i=0;i<N-1;i++) 34 { 35 scanf("%d%d",&x,&y); 36 v[x].push_back(y); //无向图存储 37 v[y].push_back(x); 38 } 39 dfs(s); //从起点开始搜索 40 for(int i=1;i<=N;i++) 41 printf("%d ",pre[i]); 42 } 43 return 0; 44 }