题意:一个顶点数为N的生成树,对于每个点i,我们按照与i的距离给出顺序,即dis i 1<=dis i 2<=dis i 3<=...,现在让你输出N-1条边,即还原这棵树。
思路:首先应该得到距离为1的点对,那些肯定是树边,然后这样得到的树边可能<N-1,后面不容易判定哪些是树边。搜索什么的都不好搞。
正解:先假定一个点为树根,那么我们按照距离根的距离由远到近来得到树边。这样保证了得到的树边由下指向上,保证了刚刚好N-1条边。
3
2
1 2
2 1
5
1 4 5 3 2
2 3 4 1 5
3 4 2 5 1
4 3 1 5 2
5 4 3 1 2
3
1 3 2
2 1 3
3 1 2
Output
2 1
2 3
3 4
5 4
4 1
2 1
3 1
#include<bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<=b;i++) using namespace std; const int maxn=2010; int a[maxn][maxn],vis[maxn]; int main() { int T,N; scanf("%d",&T); while(T--){ scanf("%d",&N); rep(i,1,N) rep(j,1,N) scanf("%d",&a[i][j]); int now=N; while(true){ int x=a[1][now],y=2; while(vis[a[x][y]]) y++; printf("%d %d ",a[x][y],x); vis[x]=1; now--; if(now==1) break; } puts(""); memset(vis,0,sizeof(vis)); } return 0; }