POJ 1258 Agri-Net (Prime)模板题

<题目链接>

题目大意:

给你N*N矩阵,表示N个村庄之间的距离。FJ要把N个村庄全都连接起来,求连接的最短距离(即求最小生成树)。

解题分析:

Prim模板题,类似于这种完全图的情况下,用Prim求最小生成树较Kruskal更优一点。 

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;

#define REP(i,s,t) for(int i=s;i<=t;i++)
const int INF = 0x3f3f3f3f;
const int N = 105;
int n,mpa[N][N],vis[N],dis[N*N];

void Prim(){
    long long sum=0;
    memset(vis,0,sizeof(vis));
    int cur=1;vis[cur]=1;
    REP(i,2,n)dis[i]=mpa[cur][i];
    REP(i,2,n){
        int mn=INF,loc;
        REP(j,1,n){
            if(!vis[j]&&mn>dis[j]){
                mn=dis[j];
                loc=j;
            }
        }
        sum+=mn;
        vis[loc]=1;
        REP(j,1,n){
            if(!vis[j]&&dis[j]>mpa[loc][j])
                dis[j]=mpa[loc][j];
        }
    }
    printf("%lld\n",sum);
}

int main(){
    while(~scanf("%d",&n)){
        memset(mpa,INF,sizeof(mpa));
        REP(i,1,n) REP(j,1,n){
            cin>>mpa[i][j];
        }
        Prim();
    }
}

 

posted @ 2018-04-01 19:32  悠悠呦~  阅读(170)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end