真是神奇的思路,按时间从大到小排序,只要点的连通性改变,且中间有时间间隔。答案就要加1.
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;
const int maxn = 1000000;
int n,m;
struct Edge{
int u;
int v;
int d;
}edge[maxn];
bool cmp(Edge e1,Edge e2) {
return e1.d > e2.d;
}
int f[maxn];
void initSet() {
for(int i = 1; i <= n; i++) {
f[i] = i;
}
}
int findSet(int x) {
int temp = x;
while(f[x]!=x) {
x = f[x];
}
while(f[temp]!=temp) {
temp = f[temp];
f[temp] = x;
}
return x;
}
void unionSet(int x,int y) {
f[x] = y;
}
int main() {
while(~scanf("%d%d",&n,&m)){
for(int i = 0; i < m; i++) {
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].d);
}
sort(edge,edge+m,cmp);
int pre = -1,ans=0;
initSet();
int u,v,fu,fv;
for(int i = 0; i < m; i++) {
u = edge[i].u;
v = edge[i].v;
fu = findSet(u);
fv = findSet(v);
if(fu != fv) {
unionSet(fu,fv);
if(edge[i].d != pre) {
ans++;
pre = edge[i].d;
}
}
}
printf("%d\n",ans);
}
return 0;
}