从最后一天开始往前加边。
同一天的边同时加到图上,加完之后检查集合数量是否和没加之前有变化。
有变化的话,答案就+1.
#include<cstdio>
#include <iostream>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std; const int maxn=+;
int n,m; struct Edge
{
int u,v,c;
}e[maxn];
int f[maxn]; bool cmp(const Edge&a,const Edge&b)
{
return a.c>b.c;
} int Find(int x)
{
if(x!=f[x]) return f[x]=Find(f[x]);
return f[x];
} int main()
{
while(~scanf("%d%d",&n,&m)){
for(int i=;i<=m;i++)
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].c);
sort(e+,e++m,cmp); for(int i=;i<=n;i++) f[i]=i; int L=,R=,ans=; while()
{
while()
{
if(e[R].c==e[L].c) R++;
else break;
} int d=;
for(int i=L;i<=R-;i++)
{
int fu=Find(e[i].u);
int fv=Find(e[i].v);
if(fu!=fv) d=,f[fu]=fv; } ans=ans+d;
L=R; if(L>m) break;
} printf("%d\n",ans);
}
return ;
}