【用結構體數組完成最小生成樹+並查集】

#include <iostream>  
#include <cstring>  
#include <algorithm>  
  
using namespace std;  
  
typedef struct Line  
{  
    int u;  
    int v;  
    int w;  
};  
  
const int MAXN=110;  
int arr[MAXN];  
Line lines[MAXN*MAXN/2];  
int q,ans;  
  
bool cmp(Line a,Line b)  
{  
    return a.w<b.w;  
}  
  
int find_father(int x)  
{  
    return x==arr[x]?x:arr[x]=find_father(arr[x]);  
}  
  
void mer(int a,int b)  
{  
    int fa=find_father(a);  
    int fb=find_father(b);  
    if(fa!=fb)  
        arr[fa]=fb;  
}  
  
void reset()  
{  
    int i;  
    memset(lines,0,sizeof(lines));  
    q=0;ans=0;  
    for(i=0;i<MAXN;i++)  
        arr[i]=i;  
}  
  
int main()  
{  
    //freopen("hdu1879.txt","r",stdin);  
    int n,i,from,to,weigh,exist;  
    while(scanf("%d",&n),n)  
    {  
        reset();  
        int nn=n*(n-1)/2;  
        while(nn--)  
        {  
            scanf("%d%d%d%d",&from,&to,&weigh,&exist);  
            if(exist)  
            {  
                mer(from,to);  
            }  
            else  
            {  
                lines[q].u=from;  
                lines[q].v=to;  
                lines[q++].w=weigh;  
            }  
        }  
        sort(lines,lines+q,cmp);  
        for(i=0;i<q;i++)  
        {  
            int fu=find_father(lines[i].u);  
            int fv=find_father(lines[i].v);  
            if(fv!=fu)  
            {  
                arr[fv]=fu;  
                ans+=lines[i].w;  
            }  
        }  
        printf("%d\n",ans);  
    }  
}  



轉自:http://blog.csdn.net/cryssdut/article/details/18826679


以下爲個人理解:


並查集做了一個劃分,提供一個搜查手段(是否已有路),如果無路,那麼從所有的可選的路里找一個最小的(事先將結構體用sort排序)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章