#include <stdio.h>
#include <stdlib.h>
#include <cstring>
int a[1005][1005], book[1005], dist[1005], sum, po[1005];
/*
*book[] 记录是否已经进入最小生成树
*dist[] 记录未进入顶点到已经入生成树顶点的最短路径(权值)
*po[] 记录未进入顶点最短路径所指向的已进入生成树的顶点(不一定所有题都需要)
*/
void prim(int n)
{
int i, j;
for( i = 0; i <n ; i++)
{
dist[i] = a[i][0];//初始每个顶点到0点的距离
po[i] = 0;//初始化每个顶点指向0顶点
}
book[0] = 1;//赋值, 代表已进入最小生成树
for(i = 1 ; i < n; i++)
{
int pos;
int Min = 100001;
for( j = 0; j < n ;j++)
{
if(!book[j]&&Min>dist[j])得到已进入顶点到未进入生成树顶点的最短路径及对应顶点j
{
Min = dist[j];
pos = j;
}
}
sum += dist[pos];
book[pos] = 1;//标记已进入
printf("%d %d\n", pos+1, po[pos]+1);//输出结果
for(j = 0 ; j < n ; j++)
{
if(!book[j]&&dist[j]>a[pos][j])//更新未进入点的最短路径及对应顶点
{
dist[j] = a[pos][j];
po[j] = pos;
}
}
}
printf("%d\n", sum);
}
int main()
{
int t, n , i, j ,k;
scanf("%d", &t);
while(t--)
{
sum = 0;
memset(book, 0, sizeof(book));
scanf("%d", &n);
// for( i = 1 ; i <= n ;i++)
// {
// scanf("%d", &a[i]);
// }
for( i = 0 ; i < n ;i++)
{
for( j = 0 ; j < n; j++)
{
a[i][j]= 100;//先设定路径数为最大,视情况而定
}
}
a[0][1]=6,a[0][2]=1,a[0][3]=5;
a[1][0]=6,a[1][2]=5,a[1][4]=3;
a[2][0]=1,a[2][1]=5,a[2][3]=5,a[2][4]=6,a[2][5]=4;
a[3][0]=5,a[3][2]=5,a[3][5]=2;
a[4][1]=3,a[4][2]=6,a[4][5]=6;
a[5][3]=2,a[5][2]=4,a[5][4]=6;
prim(n);
}
return 0;
}
输入样例如下图: