SSL 1764_并差集在KURUSKAL中的应用

来源:互联网 发布:网上绘图软件 编辑:程序博客网 时间:2024/05/20 13:06

思路

就是将变权从小到大排序,然后每次取最小变,然后用并差集查找两个点是否在同一集合中,如果不在的话就合并这两个集合,一直到把所有边做完或只有一个集合为止

#include <stdio.h>#include <algorithm>using namespace std;int f[10000000],b[10000][10000];struct arr{    int x,y,z;};arr a[10000000];int cam(arr x,arr y){    return x.z<y.z;}int find(int x){    if (!f[x]) return x;    f[x]=find(f[x]);    return f[x];}int insert(int x,int y){    if (find(x)!=find(y))    {        f[find(x)]=find(y);        return 1;    }    return 0;}int main(){    int n;    scanf("%d",&n);    for (int i=1;i<=n;i++)        for (int j=1;j<=n;j++)            scanf("%d",&b[i][j]);    int k=0;    for (int i=1;i<=n;i++)        for (int j=1;j<=n;j++)            if (i!=j&&b[i][j]!=0)            {                k++;                a[k].x=i;                a[k].y=j;                a[k].z=b[i][j];            }    sort(a+1,a+k+1,cam);    int tot=0;    for (int i=1;i<=k;i++)    {        if (find(a[i].x)!=find(a[i].y))        {            tot+=a[i].z;            insert(a[i].x,a[i].y);        }    }    printf("%d\n",tot);}
1 0