只有第十个点AC 求助
查看原帖
只有第十个点AC 求助
309392
Almond7216楼主2022/7/24 16:07

附上代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=7e4+11,maxm=7e4+100;
int n,k,m,fa[maxn],ans1,used[maxm];
struct edge{
	int num,u,v,w1,w2;
}e[maxm];
int find(int x){
	if(x==fa[x]) return x;
	return fa[x]=find(fa[x]);
}
int cmp1(edge a,edge b){
	return a.w1<a.w1;
}
int cmp2(edge a,edge b){
	return a.w2<b.w2;
}
int main(){
	cin>>n>>k>>m;
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m-1;i++)
		cin>>e[i].u>>e[i].v>>e[i].w1>>e[i].w2,e[i].num=i;
	sort(e+1,e+1+m-1,cmp1);
	int s=0;
	for(int i=1;i<=m-1;i++){
		int fu=find(e[i].u),fv=find(e[i].v);
		if(fu!=fv){
			fa[fu]=fv;
			ans1=max(ans1,e[i].w1);
			s++;
			used[e[i].num]=1;		
			if(s==k) break;
		}
	}
	sort(e+1,e+1+m-1,cmp2);
	for(int i=1;i<=m-1;i++){
		int fu=find(e[i].u),fv=find(e[i].v);
		if(fu!=fv&&used[e[i].num]==0){
			fa[fu]=fv;
			ans1=max(ans1,e[i].w2);
			used[e[i].num]=2;
		}
	}
	cout<<ans1<<'\n';
	for(int i=1;i<=m-1;i++){
		if(used[i]) cout<<i<<' '<<used[i]<<'\n';
	}
	return 0;
}

附上输出

6 
1 1 
2 1 
4 2
(此处输出应该是符合题意的)
2022/7/24 16:07
加载中...