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; }