您的位置:首页 > 其它

普里姆Prim— 最小生成树

2011-09-12 14:55 169 查看
#include<stdio.h>// 用prim算法构造五项连通图网的最小生成树

#define maxcost 1000

int gm[50][50];

void prim(int tree[],int cost[],int n)

{//从序号为0的顶点出发,建立连通网的最小生成树,二维数组gm[][]是其邻接矩阵

//顶点编号依次为0......n-1,建立的最小生成树存于数组tree中,对应的边值在cost中

int flag[50]={0};//标记数组,用于记录点是否加入到U中

int i,j,k,mincost;

for(i=0;i<n;i++)

{

cost[i]=gm[0][i];//从存储序号为0的顶点出发生成最小生成树

tree[i]=0;

}

// tree[0]=-1;

flag[0]=1;//顶点0进入U

for(i=1;i<n;i++)

{

mincost=maxcost;

for(j=1;j<n;j++)

{

if(flag[j]==0&&cost[j]<mincost)

{

mincost=cost[j];

k=j;//记忆最小的边

}

}

flag[k]=1;//k加入U集合

printf("k==%d\n",k);

for(j=1;j<n;j++)

if(flag[j]==0&&gm[k][j]<cost[j])//其中条件flag[j]==0是非常重要的

{

cost[j]=gm[k][j];//更新cost[]的最新值

tree[j]=k;

printf(" %d->%d\n",k,j);

// printf("j==%d\n",j);

}

}

}

int main()

{ freopen("1.txt","r",stdin);

printf("以序号为0的顶点出发生成最小生成树\n");

int i,j,k,n,e,c;

int tree[50],cost[50];

scanf("%d%d",&n,&e);

for(i=0;i<n;i++)

for(j=0;j<n;j++)

gm[i][j]=maxcost;

for(k=1;k<=e;k++)

{

scanf("%d%d%d",&i,&j,&c);

gm[i][j]=gm[j][i]=c;

}

prim(tree,cost,n);

for(i=0;i<n;i++)

printf("tree[%d]==%d\n",i,tree[i]);

printf("\n");

return 0;

}

//测试用例

/*7 10

0 1 50

0 2 60

1 3 65

1 4 40

2 3 52

2 6 45

3 4 50

3 5 30

3 6 42

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