吝啬的国度
时间限制: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
- 来源
- 经典题目
- 上传者
- 张云聪
原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=20
如果采用邻接矩阵建图,你懂的,进而想到链式前向星建图+BFS解决,当然用DFS也行。
AC代码:
#include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; const int maxn=100000+5; int n,s; struct Edge { int u,v,next; } edge[maxn<<1]; int head[maxn]; int cnt; bool vis[maxn]; int pre[maxn]; void Init() { cnt=0; for(int i=1; i<=n; i++) { vis[i]=false; head[i]=-1; pre[i]=-1; } } void addEdge(int u,int v) { edge[cnt].v=v; edge[cnt].next=head[u]; head[u]=cnt++; } void BFS() { vis[s]=true; pre[s]=-1; queue<int>q; q.push(s); while(!q.empty()) { int p=q.front(); q.pop(); for(int i=head[p]; i!=-1; i=edge[i].next) { int v=edge[i].v; if(!vis[v]) { vis[v]=true; pre[v]=p; q.push(v); } } } } int main() { int T; //freopen("data/20.txt","r",stdin); cin>>T; while(T--) { cin>>n>>s; int x,y; Init(); for(int i=1; i<n; i++) { scanf("%d%d",&x,&y); addEdge(x,y); addEdge(y,x); } /** for(int i=1; i<=n; i++) { cout<<i<<":"; for(int j=head[i]; ~j; j=edge[j].next) { cout<<edge[j].v<<" "; } cout<<endl; } */ BFS(); for(int i=1; i<=n; i++) { if(i!=1) printf(" "); printf("%d",pre[i]); } cout<<endl; } return 0; }
网上别人代码:Vector建图+BFS
讨论区92楼 xiangfeng林少
#include <iostream> #include <stdio.h> #include <vector> using namespace std; vector<int>a[100005]; int b[100005],n,s; void dfs(int x,int y) { for (int i = 0; i <a[x].size(); i++) if (a[x][i] != y) dfs(a[x][i],b[a[x][i]]=x); return; } int main() { int M,x,y; scanf("%d",&M); while (M--) { scanf("%d%d",&n,&s); for (int i = 1; i <n; i++) { a[i].clear(); } for (int i = 1; i <n; i++) { scanf("%d%d",&x,&y); a[x].push_back(y); //相当二维数组 a[y].push_back(x); } b[s] = -1;//与S相等则为-1 dfs(s,-1); for (int i = 1; i <= n; i++) printf("%d ",b[i]); printf("\n"); } return 0; }
OJ标程代码:
#include<iostream> #include<vector> #include<iterator> using namespace std; void MakeRoot(int search,int root,const vector<vector<int> >& g,vector<int> &result) { for(vector<int>::const_iterator it=g[search].begin();it!=g[search].end();++it) { if(result[*it]==0) { result[*it]=search; MakeRoot(*it,root,g,result); } } } int main() { int n; cin>>n; while(n--) { int m,a,b; cin>>m; int root; cin>>root; //m个点 vector<vector<int> > g(m+1,vector<int>()); for(int i=0;i!=m-1;i++) { cin>>a>>b; g[a].push_back(b); g[b].push_back(a); } vector<int> result(m+1); result[root]=-1; MakeRoot(root,root,g,result); copy(result.begin()+1,result.end(),ostream_iterator<int>(cout," ")); } }
本题目前排行第一代码
用户:李泉,运行号:1470045
#include <stdio.h> #include <memory.h> int map[100005]; void Adjust(int currentCity) { int priorCity = map[currentCity]; if (priorCity != 0) { Adjust(priorCity); map[priorCity] = currentCity; } } int main() { int i, testNum, cityNum, startCity, cityA, cityB; scanf("%d", &testNum); while (testNum-- != 0) { scanf("%d%d", &cityNum, &startCity); memset(map, 0, sizeof(int)*cityNum + 1); for (i = 1; i < cityNum; i++) { scanf("%d%d", &cityA, &cityB); if (map[cityB] == 0) { map[cityB] = cityA; } else { Adjust(cityA); map[cityA] = cityB; } } Adjust(startCity); map[startCity] = - 1; for (i = 1; i < cityNum; i++) { printf("%d ", map[i]); } printf("%d\n", map[i]); } return 0; }
转载请注明出处:http://blog.csdn.net/hurmishine
时间: 2024-12-22 18:41:19