A 并查集 B站讲解https://www.bilibili.com/video/BV1GT4y1M78d?p=1
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//typedef __int128 INT;
typedef double db;
typedef vector<int> vii;
typedef vector<ll> vll;
typedef pair<int,int> PII;
#define so sizeof
#define pb push_back
#define pf push_front
#define ppb pop_back
#define ppf pop_front
#define fi first
#define se second
#define mp make_pair
//#define lb lower_bound
#define ub upper_bound
const db esp=1e-5;
const int N=2e5+10,M=2e5+10,Max=500,inf=0x3f3f3f3f,mod=998244353;
const ll INF=0x3f3f3f3f3f3f3f3f;
int n,m;
int a,b,c;
int fth[N];
int ans,ecnt;
struct E{
int a,b;
E(int a=0,int b=0):a(a),b(b){};
};
E e[M];
int find(int x){
return (fth[x]==x)?x:fth[x]=find(fth[x]);
}
void join(int a,int b){
int fa=find(a), fb=find(b);
if(fa!=fb){
fth[fa]=fb;
}
}
void work(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) fth[i]=i;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
if(c==0){
join(a,b);
}else{
e[ecnt++]=E(a,b);
}
}
for(int i=0;i<ecnt;i++){
int a=e[i].a, b=e[i].b;
int fa=find(a), fb=find(b);
if(fa!=fb){
ans++; join(a,b);
}
}
int flag=0;
for(int i=1;i<=n;i++)
if(fth[i]==i)
flag++;
if(flag>1) puts("-1");
else{
printf("%d\n",ans);
}
return ;
}
int main(){
work();
return 0;
}


京公网安备 11010502036488号