这个题用prim和kruskal都可以做,很简单,主要是熟悉一下kruskal的模板。但是我还RE,就是没有发现100的矩阵,有10000条边,这个错误,真难受。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
struct edge{
int from,to,val;
};
edge e[10005];//这是100的矩阵
int pre[105];
bool cmp(const edge a,const edge b){
return a.val<b.val;
}//自定义排序方式
int find(int x){
if(x==pre[x])return pre[x];
else return pre[x]=find(pre[x]);
}
bool unio(int x,int y){
int xp=find(x),yp=find(y);
if(xp==yp)return false;
else {
pre[xp]=yp;
return true;
}
}//并查集
int main()
{
int n,i,j,v,sum,vtol,k;
while(scanf("%d",&n)==1){
for(i=1;i<=n;i++){
pre[i]=i;
}
sum=0;vtol=0;k=1;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
scanf("%d",&v);
e[k].from=i;
e[k].to=j;
e[k].val=v;
k++;
}
}
sort(e+1,e+k,cmp);//排序,记得加上cmp
for(i=1;i<=n*n;i++){//最多n*n次
if(unio(e[i].from,e[i].to)){
sum+=e[i].val;
vtol++;
}
//cout<<e[i].from<<" "<<e[i].to<<" "<<e[i].val<<endl;
if(vtol==n-1){
break;
}//n个顶点,n-1条边
}
cout<<sum<<endl;
}
return 0;
}