求助
查看原帖
求助
580202
Siegerkranz_2735楼主2023/11/2 12:47

给出 N 个点,M 条边的有向图,对于每个点 v,求 A(v) 表示从点 v 出发,能到达的编号最大的点。

可以用并查集做,先把每条边按照到达的的点从大到小排序,然后便利每个边,如果到达的点的fa比当前的大就合并,小数据试了几个都过了,但是交上去就10pts。

求大佬帮帮我

#include<bits/stdc++.h>
using namespace std;
int n,m,f[100005];
struct node{
	int a,b;
}edge[100005];
bool cmp(node x,node y){
	return x.b>y.b;
}
int getfa(int x){
	if(f[x]!=x)return f[x]=getfa(f[x]);
	return f[x];
}
void merge(int a,int b){
	if(getfa(a)!=getfa(b)){
		if(a<b)swap(a,b);
		f[b]=getfa(a);
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)f[i]=i;
	for(int i=1;i<=m;i++){
		cin>>edge[i].a>>edge[i].b;
	}
	sort(edge+1,edge+m+1,cmp);
	for(int i=1;i<=m;i++){
		merge(edge[i].a,max(getfa(edge[i].a),getfa(edge[i].b)));
	}
	for(int i=1;i<=n;i++)f[i]=getfa(i);
	for(int i=1;i<=n;i++)cout<<f[i]<<" ";
	return 0; 
} 
2023/11/2 12:47
加载中...