没找到和题解什么区别,但就是0分
查看原帖
没找到和题解什么区别,但就是0分
170410
向晚楼主2021/8/24 17:10

蒟蒻求帮助找不同
我的:

#include<iostream>
#include<algorithm>
using namespace std;
int n,m,num=1,sum,f[100005];
struct node{
	int u,v,w;
}r[100005];
bool cmp(node x,node y){
	return x.w<y.w;
}
int find(int x){
	if(f[x]==x) return x;
	return f[x]=find(f[x]);
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) f[i]=i;
	for(int i=1;i<=n;i++) cin>>r[i].u>>r[i].v>>r[i].w;
	sort(r+1,r+m+1,cmp);
	for(int i=1;i<=m;i++){
		if(find(r[i].u)!=find(r[i].v)){
			f[find(f[r[i].u])]=f[find(r[i].v)];
			num++;
			sum=r[i].w;
		}
		if(num==n){
			cout<<num-1<<' '<<sum<<endl;
			break;
		}
	}
	return 0;
}

题解:

#include<iostream>
#include<algorithm>
using namespace std;
int fa[100001];//父亲数组
struct p{
  int x,y,val;
}a[100001];//这里表示从x到y的分值我认为结构体更理解所以用的结构体,如有其他方式也可以试试
int find(int x){
  if(x!=fa[x])  fa[x]=find(fa[x]);
  return fa[x];
}
int bj(p a,p b){//用于后面排序
  return a.val<b.val;
}
int main()
{
  int maxx=-9999999;//初始化一个极小值
  int n,m;
  cin>>n>>m;
  for(int i=1;i<=n;i++)fa[i]=i;//初始化父亲数组
  for(int i=1;i<=m;i++)
  {
  	cin>>a[i].x>>a[i].y>>a[i].val;
  }
  int k=0;
  sort(a+1,a+1+m,bj);//从小到大排
  for(int i=1;i<=m;i++)
  {
  	if(find(a[i].x)!=find(a[i].y))
  	{
  	    maxx=a[i].val;//由于已经排序所以为一组单增数据可以不用比较大小
  		int aa=find(a[i].x);//此处我把合并函数放在这只是个人习惯。
  		int bb=find(a[i].y);
  		if(aa!=bb) fa[aa]=bb;
  		k++;//记录出现的边数
  		if(k==n-1)break;//如果边数是点数-1那么说明已经出现了最小生成树就可以直接停止了
  	}
  }
  cout<<n-1<<" "<<maxx<<endl;
}

求帮助(渴望AC的孩纸

2021/8/24 17:10
加载中...