//做法略暴力 #include <iostream> using namespace std; int n,a[101][101],l[101],r[101]; void edit(int x) //编辑结点x { int last=0; //上一个x的子结点 for (int i=1;i<=n;++i) if (a[x][i]) { if (last) { //若不是第一个结点 a[x][i]=0; a[last][i]=1; r[last]=i; } //连接上一个结点与该结点,该结点作为上一个结点的右儿子 else l[x]=i; //第一个结点作为父结点的左儿子 last=i; edit(i); //递归的编辑结点i } } int main() { cin>>n; for (int i=1;i<=n;++i) { int t,x; cin>>t; for (int j=0;j<t;++j) { cin>>x; if (x) a[i][x]=1; } } edit(1); cout<<n<<endl; for (int i=1;i<=n;++i) cout<<l[i]<<' '<<r[i]<<endl; return 0; }
4
11
2015
11
2015