最小生成树——Kruskal算法(C++)

 

源代码:

#include<cstdio>
int f[1001],xxx[1001],yyy[1001],i[1001],m,n,k(0);
long long ans(0);
void x1(int t1,int t2)
{
    int x=t1,y=t2,m=i[(t1+t2)/2],t;
    do
    {
      while (i[x]<m)
        x++;
      while (i[y]>m)
        y--;
      if (x<=y)
      {
        t=i[x];
        i[x]=i[y];
        i[y]=t;
        t=xxx[x];
        xxx[x]=xxx[y];
        xxx[y]=t;
        t=yyy[x];
        yyy[x]=yyy[y];
        yyy[y]=t;
        x++;
        y--;
      }
    }
    while (x<=y);
    if (x<t2)
      x1(x,t2);
    if (y>t1)
      x1(t1,y);
}
int x2(int t)
{
    if (f[t]==0)
      return t;
    f[t]=x2(f[t]);
    return f[t];
}
int main()
{
    scanf("%d%d",&n,&m);
    for (int a=1;a<=m;a++)
      scanf("%d%d%d",&xxx[a],&yyy[a],&i[a]);
    x1(1,m);
    for (int a=1;a<=m;a++)
    {
      int t1,t2;
      t1=x2(xxx[a]);
      t2=x2(yyy[a]);
      if (t1!=t2)
      {
        k++;
        if (k==n)
          break;  //节点计数器,以节省时间。
        f[t2]=t1;
        ans+=i[a];
      }  //利用并查集对快排完的权值进行不同集合合并处理。
    }
    printf("%d",ans);
    return 0;
}
posted @ 2016-01-04 21:42  【機關】  阅读(603)  评论(0)    收藏  举报