可以证明所有可能的边都要+1
#include<cstdio> #include<iostream> #include<algorithm> const int maxn = 400100; int fa[maxn]; int n,m; struct T{ int x,y,v; inline int operator <(const T&b)const{ return v<b.v; } }way[maxn]; inline int find(int x){ return fa[x]==x?x:fa[x]=find(fa[x]); } int main(){ std::ios::sync_with_stdio(false),std::cin.tie(0); std::cin >> n >> m; for(int i=1;i<=n;++i)fa[i]=i; for(int i=1;i<=m;++i)std::cin >> way[i].x >> way[i].y >> way[i].v; std::sort(way+1,way+m+1); int ans=0; for(int i=1;i<=m;++i){ for(int j=i;j<=m && way[j].v==way[i].v;++j)ans+=find(way[j].x)!=find(way[j].y); for(int j=i;j<=m && way[j].v==way[i].v;++j){ if(find(way[j].x)!=find(way[j].y)) fa[find(way[j].x)]=find(way[j].y); i=j; } } std::cout << ans - n + 1 << ' '; }