您的位置:首页 > 其它

codevs1078 最小生成树

2017-09-15 18:58 656 查看
最小生成树裸题

#include<bits/stdc++.h>
#define maxn 10005
using namespace std;
template <typename T> void read(T &x){
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+ch-'0';
x*=f;
}

struct Edges{
int u,v,w;
}edges[maxn];
int n,m,fa[maxn],num[maxn];

inline bool cmp(const Edges&a,const Edges&b){
return a.w<b.w;
}

inline void init(){
for(int i=1;i<=m;++i){
fa[i]=i;
num[i]=0;
}
}

int getfa(int x){
if(x==fa[x]) return x;
else return fa[x]=getfa(fa[x]);
}

bool samefa(int x,int y){
return getfa(x)==getfa(y);
}

void uniont(int x,int y){
fa[y]=x;
num[x]+=num[y];
}

void merge(int x,int y){
int fx=getfa(x),fy=getfa(y);
if(num[fx]>num[fy]) uniont(fx,fy);
else uniont(fy,fx);
}

int main(){
read(n);
int cnt=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j){
int x;
read(x);
if(j>i){
edges[++cnt].u=i;
edges[cnt].v=j;
edges[cnt].w=x;
}
}
m=cnt;
init();
sort(edges+1,edges+m+1,cmp);
int ans=0,tot=0;
for(int i=1;i<=cnt;++i){
if(samefa(edges[i].u,edges[i].v)) continue;
else{
ans+=edges[i].w;
++tot;
merge(edges[i].u,edges[i].v);
if(tot==n-1) break;
}
}
cout<<ans<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: