首页 > 代码库 > 最短路径之Kurskal
最短路径之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;
}
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;
}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。