论文网
English Papers
万事OK网
发表论文
 
 首页 > IT文章 > 程序设计 >
最小生成树kruskal算法

[科技论文网] http://www.scipapers.com    2007-12-02  

    最小生成树kruskal算法

    /*
      Name:最小生成树kruskal算法
      Author:wujilin
      Description:用邻接矩阵做图 
      Date: 21-07-06 23:07
      Copyright:wujilin
    */

    #include<stdio.h>
    #include<stdlib.h>
    #define M 20
    #define MAX 20

    typedef struct
    {
     int begin;
     int end;
     int weight;
    }edge;

    typedef struct
    {
     int adj;
     int weight;
    }AdjMatrix[MAX][MAX];

    typedef struct
    {
     AdjMatrix arc;
     int vexnum, arcnum;
    }MGraph;
    void CreatGraph(MGraph *);//函数申明
    void sort(edge* ,MGraph *);
    void MiniSpanTree(MGraph *);
    int  Find(int *, int );
    void Swapn(edge *, int, int);
    void CreatGraph(MGraph *G)//构件图
    {
     int i, j,n, m;

     printf("请输入边数和顶点数:");
     scanf("%d %d",&G->arcnum,&G->vexnum);
     
        for (i = 1; i <= G->vexnum; i++)//初始化图
     {
      for ( j = 1; j <= G->vexnum; j++)
      {
       G->arc[i][j].adj = G->arc[j][i].adj = 0;
      }
     }

     for ( i = 1; i <= G->arcnum; i++)//输入边和权值
     {
      printf("\n请输入有边的2个顶点");
      scanf("%d %d",&n,&m);
      while(n < 0 || n > G->vexnum || m < 0 || n > G->vexnum)
      {
       printf("输入的数字不符合要求 请重新输入:");
       scanf("%d%d",&n,&m);
      }
        
      G->arc[n][m].adj = G->arc[m][n].adj = 1;
      getchar();
      printf("\n请输入%d与%d之间的权值:", n, m);
      scanf("%d",&G->arc[n][m].weight);
     }
       
     printf("邻接矩阵为:\n");
     for ( i = 1; i <= G->vexnum; i++)
     { 
      for ( j = 1; j <= G->vexnum; j++)
      {
          printf("%d ",G->arc[i][j].adj);
      }
         printf("\n");
     }
    }

    void sort(edge edges[],MGraph *G)//对权值进行排序
    {
     int i, j;

     for ( i = 1; i < G->arcnum; i++)
     {
      for ( j = i + 1; j <= G->arcnum; j++)
      {
       if (edges[i].weight > edges[j].weight)
       {
        Swapn(edges, i, j);
       }
      }
     }
       
     printf("权排序之后的为:\n");
     for (i = 1; i < G->arcnum; i++)
     {
         printf("<< %d, %d >>   %d\n", edges[i].begin, edges[i].end, edges[i].weight);
     }

    }

    void Swapn(edge *edges,int i, int j)//交换权值 以及头和尾 

     
     int temp;   
     
     temp = edges[i].begin;  
        edges[i].begin = edges[j].begin;
        edges[j].begin = temp;
        temp = edges[i].end;  
        edges[i].end = edges[j].end;
        edges[j].end = temp;
        temp = edges[i].weight;  
        edges[i].weight = edges[j].weight;
        edges[j].weight = temp;
    }

    void MiniSpanTree(MGraph *G)//生成最小生成树
    {
     int i, j, n, m;
     int k = 1;
        int parent[M];

     edge edges[M];
     
     for ( i = 1; i < G->vexnum; i++)
     {
      for (j = i + 1; j <= G->vexnum; j++)
      {
       if (G->arc[i][j].adj == 1)
       {
        edges[k].begin = i;
        edges[k].end = j;
        edges[k].weight = G->arc[i][j].weight;
           k++;
       }
       
      }
     }
           
        sort(edges, G);
        for (i = 1; i <= G->arcnum; i++)
     {
      parent[i] = 0;
     }
        printf("最小生成树为:\n");
     for (i = 1; i <= G->arcnum; i++)//核心部分
     {
      n = Find(parent, edges[i].begin);
      m = Find(parent, edges[i].end);
      if (n != m)
      {
         parent[n] = m;
         printf("<< %d, %d >>   %d\n", edges[i].begin, edges[i].end, edges[i].weight);
      }
     }
    }

    int Find(int *parent, int f)//找尾
    {
     while ( parent[f] > 0)
     {
      f = parent[f];
     }
        return f;
    }

    int main(void)//主函数
    {
     MGraph *G;

     G = (MGraph*)malloc(sizeof(MGraph));
     if (G == NULL)
     {
      printf("memory allcation failed,goodbye");
      exit(1);
     }
       
     CreatGraph(G);
        MiniSpanTree(G);
      
     system("pause");
     return 0;

        来源:

声明:本文由网友推荐或作者提交,版权归原作者所有,刊登此文仅为传播知识,展示研究成果,提高文章引用率。未经原作者授权,禁止用于任何形式的商业行为。科技论文网倡导尊重知识、尊重劳动、保护原创、知识共享。由于部分论文文章来于网络,文章作者不祥,请相关的原创作者与我们联系,以便加上您的署名。

  
最小生成树kruskal算法
下面没有链接了     递归与动态编程
最新论文
·[程序设计]最小生成树kruskal算法
·[程序设计]递归与动态编程
·[程序设计]经典IPC问题 - 哲学家进餐
·[程序设计]整数分解算法
·[程序设计]双核CPU上的快速排序效率
·[程序设计]经典的图论算法C++描述
·[程序设计]常用算法—贪婪法
·[程序设计]20世纪10个最伟大的算法
·[程序设计]任意阶奇数幻方C程序
·[程序设计]二叉查找树示例
 
 

搜索论文

Google
论文分类

论文网 论文发表网 论文 免费论文网 找论文网 毕业论文 中国论文网 英语论文 百度论文 聘教网 易搜
 免费发布论文    中国论文网 2008版权所有  业务联系:pinjiao@126.com