最短路径之Kurskal

个人观点,较prime算法,Kurskal算法更加的简单,这里我们只需要每一次去需找权值最小的那条边就好,在这里我们先可以利用sort进行快排,得到权值最小的map[i] 。 得到该条边的两个节点map[i].u 和map[i].v,这时候你需要判断能不能用这条边,因为最小生成树是不能形成回路,所以用到了 并查集的方法,可以快速的判断这两个点是否满足条件。如果不存在关系那么那么就把这条边加入,反之,舍弃该边,直到e-1边为止。
(该代码未印证过~~)
#include
#include
#include
using namespace std ;

#define INT_MAX 1000000
#define MAXN 100

int father[MAXN] ;

typedef struct node
{
 

   int u , v ;
    int w ;

}Kruskal ;

int cmp(Kruskal x , Kruskal y)
{
    return x.w < y.w ;

}
//该函数是用来寻找父亲节点的 ,在后面的用处就是判断两个节点是否存在关系
//如果存在那么这两个点不能加进来,加进来会形成回路 。
find (int x)
{
    while(x != father[x])
        x = father[x] ;
    return x ;

}

int main()
{
    Kruskal  map[MAXN] ;

    int e , n ;
    int i , j ;
    int result = 0 ,cot = 0 ;

    scanf("%d", &e) ;

    for(i = 1 ; i <= e ;i++)
        father[i] = i ;
    
    for(i = 1 ; i <= e ; i++)
        scanf("%d%d%d", &map[i].u , &map[i].v , &map[i].w ) ;
    sort(map + 1 , map + e + 1 ,cmp ) ;

    int u , v ;

    for(i = 1 ; i <= e ;i++){
    
        u = map[i].u ;
        v = map[i].v ;

        if(find(u) != find(v))
        {
            father[u] = v ;
            result += map[i].w ;
            cot++ ;
        }
        if(cot == e-1)
            break ;        
    }

    return 0 ;
}
posted @ 2014-07-30 10:53  DF丶大W  阅读(301)  评论(0编辑  收藏  举报