题意:给n*n矩阵,表示第i个农场到第j个农场的距离
裸地最小生成树
#include <iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<cmath>
#include<queue>
#define N 222
int map[N][N];
int vis[N];
using namespace std;
#define INF 2222222
int dis[N];
int n;
int v;
void prim()
{
__int64 ans=0;int pos;
memset(vis,0,sizeof vis);
for(int i=1;i<=n;i++)//从某个点开始进行添加
dis[i]=map[i][1];
dis[1]=0;vis[1]=1;
for(int i=1;i<n;i++)//再更新n-1次
{
int min=INF;//找出最小权值并记录位置
for(int j=1;j<=n;j++)
if(!vis[j]&&min>dis[j])
{
min=dis[j];
pos=j;
}
vis[pos]=1;//标记该点已添加
ans+=min;//最小权值相加
for(int j=1;j<=n;j++)//更新权值
if(!vis[j]&&dis[j]>map[j][pos])
dis[j]=map[j][pos];
}
printf("%I64d\n",ans);
}
int main()
{
while(~scanf("%d",&n))
{
memset(map,INF,sizeof map);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&v);
map[i][j]=map[j][i]=v;
}
prim();
}
return 0;
}