并查集+思维。
一开始想先按天数从小到大排序,然后遍历边,看是否在一个集合中,然后......就对题目要求卡住了,因为按从小到大加入集合,天数是不对的,拿题目例子可以看出,变为3天(而且这个思路也没道理)
题解按天数从大到小,妙
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 10;
struct Node
{
int x, y;
int day;
}node[maxn];
int n, m;
int fa[maxn];
bool cmp(Node a, Node b)
{
return a.day > b.day;
}
int findfa(int x)
{
if(fa[x] == x) return x;
return fa[x] = findfa(fa[x]);
//fa[x] = findfa(fa[x]);
//return fa[x];
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i++)
fa[i] = i;
for(int i = 0; i < m; i++)
{
scanf("%d%d%d", &node[i].x, &node[i].y, &node[i].day);
}
sort(node, node + m, cmp);
int cur;
int ans = 0;
for(int i = 0; i < m; i++)
{
int day = node[i].day;
int x = node[i].x;
int y = node[i].y;
int fx = findfa(x);
int fy = findfa(y);
/*
cout << i << ":\n";
for(int i = 1; i <= n; i++)
cout << fa[i] << " ";
cout << endl;
cout << "now edge: " << x << "," << y << " " << fx << "," <<fy << endl;
*/
if(fx != fy)
{
fa[fy] = fx;
if(i == 0 || day < cur)
{
ans++;
cur = day;
}
}
}
cout << ans << endl;
return 0;
}