wikioi 1078 最小生成树

来源:互联网 发布:人工智能会毁灭人类吗 编辑:程序博客网 时间:2024/06/14 06:14
#include<cstdio>#include<cstdlib>const int maxn=102;const int maxm=10002;int n,m;int parent[maxn],ans;int head[maxm],tail[maxm],w[maxm];int find(int a){if(parent[a]==a)return a;parent[a]=find(parent[a]);return parent[a];}void Union(int a,int b){parent[find(b)]=find(a);}void swap(int *a,int *b){int tmp=*a;*a=*b;*b=tmp;}void sort(int l,int r){int key=w[rand()%(r-l+1)+l];int i=l,j=r;while(i<=j){while(w[i]<key)i++;while(w[j]>key)j--;if(i<=j){swap(&w[i],&w[j]);swap(&head[i],&head[j]);swap(&tail[i],&tail[j]);i++;j--;}}if(l<j)sort(l,j);if(i<r)sort(i,r);}int main(){scanf("%d",&n);for(int i=1;i<=n;i++)parent[i]=i;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){m++;scanf("%d",&w[m]);head[m]=i;tail[m]=j;}}sort(1,m);for(int i=1;i<=m;i++){int u=head[i];int v=tail[i];if(find(u)==find(v))continue;ans+=w[i];Union(u,v);}printf("%d",ans);return 0;}

0 0
原创粉丝点击