问题 1435: [蓝桥杯][历届试题]国王的烦恼

点击链接查看题目

真是神奇的思路,按时间从大到小排序,只要点的连通性改变,且中间有时间间隔。答案就要加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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值