您的位置:首页 > 编程语言 > C语言/C++

c语言:最小生成树之Prim算法

2017-11-28 19:27 369 查看


#include <stdio.h>
#include <stdlib.h>
#define MaxNum 10000

typedef struct
{
int fromvex, tovex;
int weight;
} Edge;
typedef Edge *EdgeNode;
int n;
int arcnum;

void CreatMatrix(int GA[n+1][n+1])
{
int i, j, k, e;

for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
if(i==j)
{
GA[i][j]=0;
}
else
{
GA[i][j]=MaxNum;
}
}
}

printf("请输入边的信息,按照起点,终点,权值的形式输入:\n");

for(k=1; k<=arcnum; k++)
{
scanf("%d,%d,%d",&i,&j,&e);
GA[i][j]=e;
GA[j][i]=e;
}

}

void InitEdge(EdgeNode GE,int m)
{
int i;
for(i=1; i<=m; i++)
{
GE[i].weight=0;
}
}

void GetEdgeSet(int GA[n+1][n+1],EdgeNode GE)
{
int i, j, k = 1;
for(i=1; i<=n; i++)
{
for(j=i+1; j<=n; j++)
{
if(GA[i][j] !=0 && GA[i][j] != MaxNum)
{
GE[k].fromvex = i;
GE[k].tovex = j;
GE[k].weight = GA[i][j];
k++;
}
}
}
}

void SortEdge(EdgeNode GE,int m)
{
int i,j,k;
Edge temp;
for(i=1; i<m; i++)
{
k=i;
for(j=i+1; j<=m; j++)
{
if(GE[k].weight > GE[j].weight)
{
k=j;
}
}
if(k!=i)
{
temp = GE[i];
GE[i]=GE[k];
GE[k]=temp;
}
}
}

void Prim(int GA[n+1][n+1],EdgeNode T)
{
int i,j,k,min,u,m,w;
Edge temp;

k=1;
for(i=1; i<=n; i++)
{
if(i!=1)
{
T[k].fromvex=1;
T[k].tovex=i;
T[k].weight=GA[1][i];
k++;
}
}

for(k=1; k<n; k++)
{
min=MaxNum;
m=k;
for(j=k; j<n; j++)
{
if(T[j].weight<min)
{
min=T[j].weight;
m=j;
}
}

temp=T[k];
T[k]=T[m];
T[m]=temp;

j=T[k].tovex;

for(i=k+1; i<n; i++)
{
u=T[i].tovex;
w=GA[j][u];
if(w<T[i].weight)
{
T[i].weight=w;
T[i].fromvex=j;
}
}
}
}

void OutEdge(EdgeNode GE,int e)
{
int i;
printf("按照起点,终点,权值的形式输出的最小生成树为:\n");
for(i=1; i<=e; i++)
{
printf("%d,%d,%d\n",GE[i].fromvex,GE[i].tovex,GE[i].weight);
}

}

int main()
{

printf("请输入顶点的个数:");
scanf("%d",&n);

printf("请输入边的个数:");
scanf("%d", &arcnum);

int GA[n+1][n+1];
Edge GE[n*(n-1)/2], T
;

CreatMatrix(GA);

InitEdge(GE,arcnum);
GetEdgeSet(GA,GE);
SortEdge(GE,arcnum);
Prim(GA,T);
printf("\n");
OutEdge(T,n-1);

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