POJ 1258 Agri-Net

 题目链接

http://poj.org/problem?id=1258

题目大意:

农民约翰竞选为了这个小镇的市长,他竞选的时候承诺要把他所管辖区域的所有地方的网络连接起来。当然他需要你的帮助,约翰需要一个可以快速到达所有农民的联通网,为了降低成本他想要最少的光纤来来连接其他的农场。

给你一个表,代表从一个农场到达另一个农场所需要的光纤花费,你要找出将所有农场连接起来的最小花费。每个农场都要连接起来, 我从一个农场可以到达其他任何一个农场,这里农场之间的距离不会超过 100000.

输入:

输入包含多个测试实例, 第一个一个 N 代表有N 个城镇,  然后是个 N*N 的邻接矩阵,

输出:

输出最小生成树。

题目分析:

明显的是求一个最小生成树,因为下面给的就是邻接矩阵, 所以我们用邻接矩阵写是最好不过了, 直接 Prime+ 邻接矩阵搞定

#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define INF 0xfffffff
#define maxn 103

struct Edge
{
    int e, w;
    Edge(int e=0,int w=0) : e(e), w(w) {}
};

int G[maxn][maxn];
bool vis[maxn];
int dist[maxn], n;
int Prime()
{
    int sum = 0;
    dist[0] = 0;
    for(int i=0; i<n; i++)
    {
        int Min = INF, index;
        for(int j=0; j<n; j++)
        {
            if(!vis[j] && Min > dist[j])
                index = j, Min = dist[j];
        }
        sum += Min;
        vis[index] = true;

        for(int j=0; j<n; j++)
        {
            if(!vis[j] && dist[j] > G[index][j])
            {
                dist[j] = G[index][j];
            }
        }
    }
    return sum;
}
void Init()
{
    for(int i=0; i<n; i++)
    {
        vis[i] = false;
        dist[i] = INF;
    }
}

int main()
{
    while(cin >> n)
    {
        Init();
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                cin >> G[i][j];
            }
        }

        int ans = Prime();

        cout << ans <<endl;
    }
    return 0;
}

 

posted @ 2015-01-01 14:00  向前走丶不回首  阅读(141)  评论(0编辑  收藏  举报