#include <stdio.h>
#include <string.h>
#define MaxInt 999
#define N 110
int map[N][N],low[N],visited[N],a[N],b[N];
int n;
int prim()
{
int i,j,pos,min,result=0;
memset(visited,0,sizeof(visited));
visited[1]=1;pos=1;
for(i=1;i<=n;i++)//第一次给low数组赋值
{
if(i!=pos)
{
low[i]=map[pos][i];
a[i]=pos;
b[i]=i;
}
}
for(i=1;i<n;i++)//再运行n-1次
{
min=MaxInt;
for(j=1;j<=n;j++)
{
if(visited[j]==0&&min>low[j])
{
min=low[j];pos=j;
}
}
result+=min;//最小权值累加
visited[pos]=1;//标记该点
for(j=1;j<=n;j++)//更新权值
{
if(visited[j]==0&&low[j]>map[pos][j])
{
low[j]=map[pos][j];
a[j]=pos;
b[j]=j;
}
}
}
return result;
}
int main()
{
int i,v,j,ans;
printf("\n请输入点的个数: ");
while(scanf("%d",&n)!=EOF)
{
printf("\n请输入加权矩阵:\n\n");
memset(map,MaxInt,sizeof(map));
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&v);
map[i][j]=map[i][j]=v;
}
}
ans=prim();
printf("\n\n最小生成树的长为: %d\n",ans);
printf("\n最短路径为:\n\n");
for(i=2;i<=n;i++)
{
printf("(%d,%d) ",a[i],b[i]);
printf("\n");
}
}
return 0;
#include <string.h>
#define MaxInt 999
#define N 110
int map[N][N],low[N],visited[N],a[N],b[N];
int n;
int prim()
{
int i,j,pos,min,result=0;
memset(visited,0,sizeof(visited));
visited[1]=1;pos=1;
for(i=1;i<=n;i++)//第一次给low数组赋值
{
if(i!=pos)
{
low[i]=map[pos][i];
a[i]=pos;
b[i]=i;
}
}
for(i=1;i<n;i++)//再运行n-1次
{
min=MaxInt;
for(j=1;j<=n;j++)
{
if(visited[j]==0&&min>low[j])
{
min=low[j];pos=j;
}
}
result+=min;//最小权值累加
visited[pos]=1;//标记该点
for(j=1;j<=n;j++)//更新权值
{
if(visited[j]==0&&low[j]>map[pos][j])
{
low[j]=map[pos][j];
a[j]=pos;
b[j]=j;
}
}
}
return result;
}
int main()
{
int i,v,j,ans;
printf("\n请输入点的个数: ");
while(scanf("%d",&n)!=EOF)
{
printf("\n请输入加权矩阵:\n\n");
memset(map,MaxInt,sizeof(map));
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&v);
map[i][j]=map[i][j]=v;
}
}
ans=prim();
printf("\n\n最小生成树的长为: %d\n",ans);
printf("\n最短路径为:\n\n");
for(i=2;i<=n;i++)
{
printf("(%d,%d) ",a[i],b[i]);
printf("\n");
}
}
return 0;
}