克鲁斯卡尔算法思想:
1.有个Struct定义边的信息.
2.通过并查集和排序找得到最小权值(函数:1.UFset,2.Find,3.Union。)
3.找到权值的最小值的父亲关系相同放弃,否拿下Kruskal;
通俗来说:从小到大的边权值寻找,一路不重复地加入新的最小权值,直到当前所有的点num大于n点加提前结束完。(当前是最优)。
1.有个Struct定义边的信息.
2.通过并查集和排序找得到最小权值(函数:1.UFset,2.Find,3.Union。)
3.找到权值的最小值的父亲关系相同放弃,否拿下Kruskal;
4.一直把所有的点合成通过连通分量。
#define Max 2000000
#define Maxn 2000
struct edge
{
int u,v;
int w;
}edges[Max];
int parent[Maxn];
int n,m;
int i,j;
void UFset()
{
for(i=0;i<=n;i++)
parent[i]=i;
}
int Find(int x)
{
if(x!=parent[x])
parent[x]=Find(parent[x]);
return parent[x];
}
void Union(int R1,int R2)
{
int r1=Find(R1);
int r2=Find(R2);
parent[r1]=r2;
}
int cmp(const void * a,const void * b)
{
return (*(struct edge *)a).w - (*(struct edge *)b).w;
}
int Kruskal()
{
int sumweight=0;
int num=0;
int u,v;
UFset();
for(i=0;i<m;i++)
{
u=edges[i].u;
v=edges[i].v;
if(Find(u)!=Find(v))
{
sumweight+=edges[i].w;
num++;
Union(u,v);
}
if(num>=n-1)break;
}
return sumweight;
}
qsort(edges,m,sizeof(edges[0]),cmp);
通俗来说:从小到大的边权值寻找,一路不重复地加入新的最小权值,直到当前所有的点num大于n点加提前结束完。(当前是最优)。