最小生成樹(shù),Kruskal算法。
算法很簡(jiǎn)單,先把邊排序,依次找鏈接不同集合的最小邊,合并集合,當(dāng)只有一個(gè)集合的時(shí)候結(jié)束。問(wèn)題在于如何實(shí)現(xiàn)集合合并,學(xué)長(zhǎng)們說(shuō)合并時(shí)用并查集效率較高。我這里用不同的數(shù)字代表不同的集合,每次合并都要遍歷所有集合,改變集合數(shù)字,時(shí)間復(fù)雜度O(n)。
Ege結(jié)構(gòu)體中剛開(kāi)始把b、d兩個(gè)變量定義成了char,數(shù)據(jù)小的時(shí)候沒(méi)問(wèn)題,當(dāng)數(shù)據(jù)大于127時(shí)就會(huì)爆掉,糾結(jié)了很久。
qsort()函數(shù)用法:void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));
base是數(shù)組起始下標(biāo);
nelem是元素個(gè)數(shù);
width是單個(gè)元素的大??;
fcmp是比較函數(shù)。


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define LEN 600000
typedef struct


{
int x;
int y;
int bl;//set the point belong to
}Point;
typedef struct


{
int b;//begin point//最糾結(jié)的就是這里,剛開(kāi)始把它定義成了char,爆了很久啊。
int d;//end point
int len;
}Ege;
Point p[760];
Ege eg[LEN];
int cmp(const void *a, const void *b)


{
Ege * a0 = (Ege*)a;
Ege * b0 = (Ege*)b;
return a0 -> len - b0 -> len;
}
int k;
void MakeEge(int n)


{
int i, j;
k = 0;
for(i = 0; i < n - 1; i++)
for(j = i + 1; j < n; j++)

{
eg[k].b = i;
eg[k].d = j;
eg[k].len = (p[i].x - p[j].x) * (p[i].x - p[j].x) + (p[i].y - p[j].y) * (p[i].y - p[j].y);
k++;
}
}
int main()


{
int N, M;
int i, j;
int en;
int min, max;
FILE *fp = fopen("outege.txt", "w");
while(scanf("%d", &N) == 1)

{
en = 0;
for(i = 0; i < N; i++)// read point

{
scanf("%d%d", &p[i].x, &p[i].y);
p[i].bl = i;
}
scanf("%d", &M);
for(i = 0; i < M; i++)//read M eges

{
int b, d, b0, d0;
scanf("%d%d", &b0, &d0);
b = b0 - 1;
d = d0 - 1;
if(p[b].bl != p[d].bl)

{
en++;
min = p[b].bl < p[d].bl ? p[b].bl : p[d].bl;
max = p[b].bl > p[d].bl ? p[b].bl : p[d].bl;
for(j = 0; j < N; j++)// connect set

{
if(p[j].bl == max)

{
p[j].bl = min;
}
}
}
}
MakeEge(N);
qsort(eg, N * (N - 1) / 2, sizeof(Ege), cmp);
for(i = 0; en < N - 1 && i < N * (N - 1) / 2; i++)//test each eges

{
int b, d;
b = eg[i].b;
d = eg[i].d;
if(p[b].bl != p[d].bl)

{
en++;
printf("%d %d\n", b + 1, d + 1);//out this ege
min = p[b].bl < p[d].bl ? p[b].bl : p[d].bl;
max = p[b].bl > p[d].bl ? p[b].bl : p[d].bl;
for(j = 0; j < N; j++)//connect set

{
if(p[j].bl == max)

{
p[j].bl = min;
}
}
}
}
}
return 0;
}

posted on 2012-04-19 17:28
小鼠標(biāo) 閱讀(472)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
圖論