原题凉了好久了所以来学术版提问
我想半天想不明白为什么题解对了我全错,唯一能想到的就是并查集合并那里,但我我检查了半个小时(日常眼瞎)也没发现哪里错了,希望大佬能指出
这是我的代码
#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;
}