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

来源:互联网 发布:阿里云linux服务器搭建 编辑:程序博客网 时间:2024/06/05 01:14

http://img.blog.csdn.net/20150812001556846?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center



#include <stdio.h>#include <stdlib.h>#define MaxNum 10000typedef 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[n];    CreatMatrix(GA);    InitEdge(GE,arcnum);    GetEdgeSet(GA,GE);    SortEdge(GE,arcnum);    Prim(GA,T);    printf("\n");    OutEdge(T,n-1);    system("pause");    return 0;}




原创粉丝点击