采用Prim算法生成输入图的最小生成树。
输入:
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
输入输出样例: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 <stdio.h>
#include <stdlib.h>
#define maxcost 1000
#define max 15
int sort(int tree[max],int pointnums)
{
int i,min=tree[1],k;
for(i=2; i<pointnums; i++)
{
if(min>tree[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; i<pointnums; i++)
{
cost[i]=gm[0][i];
tree[i]=0;
}
flag[0]=1;
for(i=1; i<pointnums; i++)
{
mincost=maxcost;
for(j=1; j<pointnums; j++)
{
if(flag[j]==0&&cost[j]<mincost)
{
mincost=cost[j];
k=j;
}
}
flag[k]=1;
for(j=1; j<pointnums; j++)
if(flag[j]==0&&gm[k][j]<cost[j])
{
cost[j]=gm[k][j];
tree[j]=k;
}
}
for(i=1; i<pointnums; i++)
{
if(tree[i]!=maxcost)
{
if(tree[i]<i)
{
min=sort(tree,pointnums);
if(tree[i]==tree[min])
{
printf("%d %d\n",tree[i],i);
tree[i]=maxcost;
}
else
{
printf("%d %d\n",tree[min],min);
tree[min]=maxcost;
i--;
}
}
if(tree[i]>i)
{
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<pointnums; i++)
scanf("%d",&arr[i]);
scanf("%d",&edgenums);
for(i=0; i<pointnums; i++)
for(j=0; j<pointnums; j++)
gm[i][j]=maxcost;//初始化矩阵,使矩阵每个位置为大值
while(count<edgenums)//输入边的信息
{
scanf("%d %d %d",&i,&j,&w);
gm[i][j]=w;
gm[j][i]=w;
count++;
}
Prim(gm,tree,cost,pointnums);
return 0;
}