【Gym-102500F】Firetrucks Are Red

牢記!並查集的合併是fa[father(u)]=father(v)不是fa[u]=father(v)

#include<bits/stdc++.h>
#define rep(i,n) for(int i=1;i<=n;i++)

using namespace std;
typedef long long ll;

const int N=400005;
ll n,m,k,x,y;
int a[N],fa[N];
map<int,int> mp;
vector<pr> ve[N];

int father(int x) {
    if(fa[x]==x) return x;
    return fa[x]=father(fa[x]);
}

void solve_m(int u) {
    cin>>x;
    if(mp.count(x)) {
        int v=mp[x];
        if(father(v)==father(u)) return ;
        else {
            fa[father(u)]=father(v);
            ve[v].push_back(pr(u,x));
            ve[u].push_back(pr(v,x));
        }
    } else mp[x]=u;
}

void dfs(int u,int fa) {
    for(pr p:ve[u]) {
        int v=p.fi;
        if(v==fa) continue;
        cout<<u<<' '<<v<<' '<<p.se<<'\n';
        dfs(v,u);
    }
}

void solve(int l=0,int r=0,int _i=1) {
    mp.clear();
    rep(i,n) fa[i]=i,ve[i].clear();
    rep(i,n) {
        cin>>m;
        rep(j,m) solve_m(i);
    }
    rep(i,n) if(father(i)!=father(1)) {
        cout<<"impossible\n";
        return ;
    } dfs(1,0);
}

int main() {
    ios::sync_with_stdio(false);
    while(cin>>n) solve();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章