您的位置:首页 > 其它

最小生成树,普里母和克鲁斯卡尔

2015-01-06 10:31 281 查看
<pre name="code" class="cpp">//邻接矩阵数据类型定义
#define MAXV 最大顶点个数
typedef char ElemType;
typedef struct
{
int no;
ElemType info;
}VertexType;
typedef struct
{
int edges[MAXV][MAXV];
int n,e;
VertexType vexs[MAXV];
}MGraph;

//最小生成树无向图(邻接矩阵)
//Prim算法从顶点开始,时间复杂度只与顶点有关,适用于稠密图(边多)O(n^2)
//Kruskal算法从边开始,时间复杂度只与边有关,适用于稀疏图O(e.log2底e的对数)
void Prim(MGraph g,int v0,int &sum)
{
int lowcost[maxSize],vset[maxSize],v;
int i,j,k,min;
v=v0;
for(i=1;i<=g.n;i++)
{
lowcost[i]=g.edges[v0][i];//存放V0到各个点的权值
vset[i]=0;
}
vset[v0]=1;
sum=0;
for(i=1;i<g.n;i++)
{
min=INF;//比图中所有边的权值都大的常量
//选出候选边的最小者
for(j=1;j<=g.n;j++)
{
if(vset[j]==0&&lowcost[j]<min)
{
min=lowcost[j];
k=j;
}
}
vset[k]=1;
v=k;
sum+=min;
//以v为媒介更新候选边
for(j=1;j<=g.n;j++)
if(vset[j]==0&&g.edges[v][j]<lowcost[j])
lowcost[j]=g.edges[v][j];
}
}

//Kruskal
typedef struct
{
int a,b;//顶点
int w;//权值
}Road;
Road road[maxSize];
int v[maxSize];
int getRoot(int a)
{
while(a!=v[a])
a=v[a];
return a;
}
void Kruskal(MGraph g,int &sum,Road road[])
{
int i;
int N,E,a,b;
N=g.n;
E=g.e;
sum=0;
for(i=1;i<=N;i++)
v[i]=i;
sort(road,E);//对road按边权值小到大排序
for(i=1;i<=E,i++)
{
a=getRoot(road[i].a);
b=getRoot(road[i].b);
if(a!=b)//不同根,即相连不构成环,把不构成环的由小到大连起来
{
v[a]=b;
sum+=road[i].w;
}
}
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: