国王的烦恼

code

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,ans,num;
struct land{
	int x,y,t;
	
};
land island[100005];
int f[100005];//Disjoint-sset array
int last_time;
void Init(){
	for(int i=0;i<n;++i){
	f[i]=i;	
	}
}
bool cmp(land x,land y){
	return x.t>y.t;
}

int getf(int x){
	if(x==f[x]){//root
		return x;
	}else{
		f[x]=getf(f[x]);//compress the path
		return f[x];
	}
}
int merge(int v,int u){
	int t1,t2;
	t1=getf(v);
	t2=getf(u);
	if(t1!=t2){
		//not same roott
		f[t2]=t1;
		return 1;
	}
	return 0;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=0;i<m;++i){
		scanf("%d%d%d",&island[i].x,&island[i].y,&island[i].t);
		
	}
	Init();
	sort(island,island+m,cmp);
	for(int i=0;i<m;++i){
		if(merge(island[i].x,island[i].y)){//same root
			
			if(island[i].t!=last_time){//wether same day of complain
				++ans;
				last_time=island[i].t;//same day only complain once
			}
			++num;
		}
		if(num==n-1){//generates a spanning tree with the fewest edges
			break;
		}
	}
	printf("%d",ans);
	return 0;
}


Q

蓝桥杯历届试题-国王的烦恼
时间限制: 1Sec 内存限制: 128MB 提交: 2683 解决: 704
题目描述
C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛。两个小岛间可能存在多座桥连接。然而,由于海水冲刷,有一些大桥面临着不能使用的危险。

如果两个小岛间的所有大桥都不能使用,则这两座小岛就不能直接到达了。然而,只要这两座小岛的居民能通过其他的桥或者其他的小岛互相到达,他们就会安然无事。但是,如果前一天两个小岛之间还有方法可以到达,后一天却不能到达了,居民们就会一起抗议。

现在C国的国王已经知道了每座桥能使用的天数,超过这个天数就不能使用了。现在他想知道居民们会有多少天进行抗议。

下文中的样例说明
第一天后2和3之间的桥不能使用,不影响。
第二天后1和2之间,以及1和3之间的桥不能使用,居民们会抗议。
第三天后3和4之间的桥不能使用,居民们会抗议。


输入
输入的第一行包含两个整数n,  m,分别表示小岛的个数和桥的数量。 
接下来m行,每行三个整数a,  b,  t,分别表示该座桥连接a号和b号两个小岛,能使用t天。小岛的编号从1开始递增。



数据规模和约定
对于100%的数据,1< =n< =10000,1< =m< =100000,1< =a,  b< =n,  1< =t< =100000。

输出
输出一个整数,表示居民们会抗议的天数。
样例输入
4 4
1 2 2
1 3 2
2 3 1
3 4 3
样例输出
2
posted @ 2022-03-02 12:20  ethon-wang  阅读(25)  评论(0编辑  收藏  举报