POJ 1258 Agri-Net最小生成树 prim

题意:给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;
}

你可能感兴趣的:(POJ 1258 Agri-Net最小生成树 prim)