连掉一个点后不是去掉这个点,还可以与其他有联系的点连接(想当然),结合案例整理题意
可以加个过程先后考虑:
用地图存数据,用并查集连接点,连接一切能连接的点,连接即连前被连即连后,直至加入n个点,用结构体存贮连接时的边
#include<bits/stdc++.h>
#define xx first;
#define yy second;
#define rep(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int maxn=2e5+5;
void lol()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
}
int n,m,cnt;
struct Unionset{
int pa[maxn];
void init (int n)
{
for(int i=1;i<=n;++i) pa[i]=i;
}
int find(int x)
{
return pa[x]==x?x:pa[x]=find(pa[x]);
}
bool same(int x,int y)
{
return find(x)==find(y);
}
bool Union(int x,int y)
{
int x1=find(x),y1=find(y);
if(x1!=y1)
{
pa[y1]=x1;
return 1;
}
return 0;
}
}u1;
map<int ,int>mp;
struct one{
int a,b,c;
}ones[maxn];
int main ()
{
lol();
cin>>n;
u1.init(n);
rep(i,1,n)
{
cin>>m;
rep(j,1,m)
{
int x;
cin>>x;
if(mp.count(x))
{
if(u1.same(mp[x],i)) continue;
else {
u1.Union(mp[x],i);
ones[++cnt].a=mp[x];
ones[cnt].b=i;
ones[cnt].c=x;
}
}
else mp[x]=i;
}
}
if(cnt<n-1)
{
cout<<"impossible";
return 0;
}
rep(i,1,n-1)
{
cout<<ones[i].a<<" "<<ones[i].b<<" "<<ones[i].c<<endl;
}
return 0;
}