使用C语言实现最小生成树求解的简单方法

2020-01-06 13:44:10王冬梅
  • }  } 
  •   /* 读取边信息 */ 
  • for (k = 0; k < n; k++)  { 
  • scanf("%c %c %d", &chx, &chy, &cost);  getchar(); 
  • i = chx - 'A' + 1;  j = chy - 'A' + 1; 
  • graph[i][j] = cost;  graph[j][i] = cost; 
  • }   
  • /* 求解最小生成树 */  cost = Prim(graph, m); 
  •   /* 输出最小权值和 */ 
  • printf("Total:%dn", cost);   
  • //system("pause");  return 0;  
  • Kruskal算法:

     

     
    1. void Kruskal(Edge E[],int n,int e)  { 
    2. int i,j,m1,m2,sn1,sn2,k;  int vset[MAXE]; 
    3. for (i=0;i<n;i++) vset[i]=i; //初始化辅助数组  k=1; //k表示当前构造最小生成树的第几条边,初值为1 
    4. j=0; //E中边的下标,初值为0  while (k<n) //生成的边数小于n时循环 
    5. {   m1=E[j].u;m2=E[j].v; //取一条边的头尾顶点 
    6. sn1=vset[m1];sn2=vset[m2]; //分别得到两个顶点所属的集合编号  if (sn1!=sn2) //两顶点属于不同的集合,该边是最小生成树的一条边 
    7. {   printf(" (%d,%d):%d/n",m1,m2,E[j].w); 
    8. k++; //生成边数增1  for (i=0;i<n;i++) //两个集合统一编号