您的位置:首页 > 其它

POJ 1258 Agri-Net最小生成树 prim

2014-08-06 20:31 369 查看
题意:给n*n矩阵,表示第i个农场到第j个农场的距离

裸地最小生成树
#include <iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<cmath>
#include<queue>
#define N 222
int map

;
int vis
;
using namespace std;
#define INF 2222222
int dis
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: