最小生成树

采用Prim算法生成输入图的最小生成树。

 

输入:

7  \\图中顶点的个数

0  \\代表图的顶点

1

2

3

4

5

10 \\边的条数

0 1 50

0 2 60

1 4 40

1 3 65

2 3 52

2 6 45

3 4 50

3 5 30

3 6 42

4 5 70  \\代表输入边的两个点以及权重

 

输出:

0 1  \\输出最小生成树的边,边中序号小的顶点先输出;按照小序号结点排序后输出;小序号相同情况下按右边序号排序输出

1 4

2 6

3 4

3 5

3 6

输入输出样例:1组

#1

  • 样例输入:
    7
    0
    1
    2
    3
    4
    5
    6
    10
    0 1 50
    0 2 60
    1 4 40
    1 3 65
    2 3 52
    2 6 45
    3 4 50
    3 5 30
    3 6 42
    4 5 70
  • 样例输出:
    0 1
    1 4
    2 6
    3 4
    3 5
    3 6
#include 
#include 
#define  maxcost 1000
#define max 15
int sort(int tree[max],int pointnums)
{
    int i,min=tree[1],k;
    for(i=2; itree[i])
        {
            min=tree[i];
            k=i;
        }
    }
    return k;
}
void Prim(int gm[max][max],int tree[max],int cost[max],int pointnums)
{

    int flag[max]= {0};
    int i,j,k,mincost,min;
    for(i=0; ii)
            {
                min=sort(tree,pointnums);
                if(i<=tree[min]&&tree[i]!=maxcost)
                {
                    printf("%d %d\n",i,tree[i]);
                    tree[i]=maxcost;
                }
                else
                {
                    printf("%d %d\n",tree[min],min);
                    tree[min]=maxcost;
                    i--;
                }
            }
        }
    }
}
int main()
{
    int i,j,w,pointnums,edgenums,count=0,arr[max];
    //w为边上权值,pointnums为点的个数,edgenums为边的个数
    //count为记录输入数的个数组,arr训处输入的点值
    scanf("%d",&pointnums);
    int gm[max][max],tree[max],cost[max];
    for(i=0; i

 

你可能感兴趣的:(数据结构)