求教
  • 板块学术版
  • 楼主mrozhx
  • 当前回复0
  • 已保存回复0
  • 发布时间2020/8/9 11:02
  • 上次更新2023/11/6 20:52:17
查看原帖
求教
150611
mrozhx楼主2020/8/9 11:02

原题凉了好久了所以来学术版提问

我想半天想不明白为什么题解对了我全错,唯一能想到的就是并查集合并那里,但我我检查了半个小时(日常眼瞎)也没发现哪里错了,希望大佬能指出

这是我的代码

#include<bits/stdc++.h>
using namespace std;
int n,m,k,fa[10010];
struct tog{
	int x,y,l;
}re[10010];
bool cmp(tog a,tog b){
	return a.l<b.l;
}
int find(int now){
	if(fa[now]==now) return now;
	else{
		fa[now]=find(fa[now]);
		return fa[now];
	}
}
int main(){
	cin>>n>>m>>k;
	if(n<k||n-m>k){
		cout<<"No Answer";
		return 0;
	}
	for(int i=1;i<=n;i++){
		fa[i]=i;
	}
	for(int i=1;i<=m;i++){
		cin>>re[i].x>>re[i].y>>re[i].l;
		if(re[i].x>re[i].y){
			int ch=re[i].x;
			re[i].x=re[i].y,re[i].y=ch;
		}
	}
	sort(re+1,re+m+1,cmp);
	int pu=n-k;
	int ans=0,num=0;
	for(int i=1;i<=m&&pu;i++){
		if(find(re[i].y)!=find(re[i].x)){
			if(fa[re[i].y]!=re[i].x)fa[re[i].y]=re[i].x;
			ans+=re[i].l;
			pu--;
		}
	}
	cout<<ans;
	return 0;
}

这是题解

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
int n,k,m;
int fa[1000050];
struct node {
	int x;
	int y;
	int l;
} a[1000005];
int cmp( const void *a , const void *b ) {
	struct node *c = (node *)a;
	struct node *d = (node *)b;
	return c->l - d->l;
}
int find(int x)
{
	if(x!=fa[x])
	fa[x]=find(fa[x]);
	return fa[x];
}
void work(int x,int y)
{
	x=find(x);
	y=find(y);
	if(x==y)
	return;
	fa[x]=y;
}
int main() {
	cin>>n>>m>>k;
	for(int i=0; i<m; i++) {
		scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].l);
	}
	qsort(a,m,sizeof(a[0]),cmp);
	for(int i=1;i<=n;i++)
	fa[i]=i;
	int num=n-k;
	int ans=0;
	for(int i=0;i<m;i++)
	{
		if(num==0)
		break;
		int aaa=find(a[i].x);
		int wzx=find(a[i].y);
		if(aaa!=wzx)
		{
			work(a[i].x,a[i].y);
			ans+=a[i].l;
			num--;
		}
	}
	if(num)
	cout<<"No Answer"<<endl;
	else
	cout<<ans<<endl;
}
2020/8/9 11:02
加载中...