MnZn kruskal只有10分,求助玄8关
查看原帖
MnZn kruskal只有10分,求助玄8关
671415
The_End_of_GCC楼主2025/7/24 15:53

code:

#include<bits/stdc++.h>
using namespace std;
struct node{
	int from,to;
	int dis1,dis2;
	int num;
}e[20005];
struct road{
	int num;
	int lv;
}ans[20005];
int n,k,m,maxn,cnt;
int fa[20005];
bool used[20005];
void init(){
	for(int i=1;i<=n;i++)
		fa[i]=i;
}
bool cmp1(node a,node b){
	return a.dis1<b.dis1;
}
bool cmp2(node a,node b){
	return a.dis2<b.dis2;
}
bool cmp3(road a,road b){
	return a.num<b.num;
}
int find(int x){
	if(fa[x]==x) return x;
	else return fa[x]=find(fa[x]);
}
int main()
{
	cin>>n>>k>>m;
	init();
	for(int i=1;i<=m-1;i++){
		cin>>e[i].from>>e[i].to>>e[i].dis1>>e[i].dis2;
		e[i].num=i;
	}
	sort(e+1,e+m,cmp1);
	int r=0;
	for(int i=1;i<=m-1;i++){
		if(r>=k) break;
		int u=find(e[i].from),v=find(e[i].to);
		if(u!=v){
			fa[u]=v;
			r++;
			maxn=max(maxn,e[i].dis1);
			used[e[i].num]=true;
			ans[++cnt].num=e[i].num;
			ans[cnt].lv=1;
		}
	}
	init();
	sort(e+1,e+m,cmp2);
	for(int i=1;i<=m-1;i++){
		if(r>=n-1) break;
		int u=find(e[i].from),v=find(e[i].to);
		if(u!=v&&used[e[i].num]==false){
			fa[u]=v;
			r++;
			maxn=max(maxn,e[i].dis2);
			ans[++cnt].num=e[i].num;
			ans[cnt].lv=2;
			//used[e[i].num]=true;
		}
	}
	sort(ans+1,ans+1+cnt,cmp3);
	cout<<maxn<<endl;
	for(int i=1;i<=cnt;i++){
		cout<<ans[i].num<<' '<<ans[i].lv<<endl;
	}
	return 0;
}
2025/7/24 15:53
加载中...