题解:用并查集保存相等信息,在并查集的根节点处用set保存不相等信息。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;
#define N 100010
set<int> se[N];
vector<int> vec;
int fa[N],a[N],b[N],e[N];
int n;
int findfa(int x)
{
if(fa[x]==x) return x;
return fa[x]=findfa(fa[x]);
}
bool check(int x,int y,int e)
{
int fx=findfa(x),fy=findfa(y),fz;
if(e==1)
{
if(fx==fy) return true;
if(se[fx].size()<se[fy].size()) swap(fx,fy);
for(auto z:se[fy])
{
fz=findfa(z);
if(fz==fx) return false;
se[fz].insert(fx);se[fx].insert(fz);
}
fa[fy]=fx;
}
else
{
if(fx==fy) return false;
se[fx].insert(fy);se[fy].insert(fx);
}
return true;
}
int main()
{
scanf("%d",&n);
int last=0;
for(int i=1;i<=n;++i) fa[i]=i;
for(int i=1;i<=n;++i)
{
scanf("%d%d%d",&a[i],&b[i],&e[i]);
if(!check(a[i],b[i],e[i]))
{
vec.push_back(i-last);
for(int j=last+1;j<=i;++j)
{
fa[a[j]]=a[j];fa[b[j]]=b[j];
se[a[j]].clear();se[b[j]].clear();
}
last=i;
}
}
printf("%d\n",vec.size());
for(int i=0;i<vec.size();++i) printf("%d\n",vec[i]);
return 0;
}
/*
4
1 1 0
2 2 0
1 1 0
1 1 0
6
1 5 0
1 2 1
2 3 1
3 4 1
4 5 1
1 1 0
*/