【t047】网络

Time Limit: 1 second
Memory Limit: 128 MB

【问题描述】

Bessie受雇来到John的农场帮他们建立internet网络。农场有 N (2<= N <= 1,000)牛棚,编号为1..N。John之前已经勘测过,
发现有M(1<=M<=20,000)条可能的连接线路,一条线路是连接某两个牛棚的。每条可能的线路都有一个建设费用C
(1<=C<=100,000)。John当然想花尽量少的钱,甚至克扣Bessie的工钱。
Bessie发现了这点,很生气,决定给John捣乱。她要选择一些线路组成网,但费用却尽可能大。当然网络要能正常工作,也就是
任意两个牛棚之间都是相互可以连通的,并且网络上不能有环,不然John会很容易发现的。
请计算组建这种网络最多可能的费用。
【输入格式】

第一行:两个整数 N M
下面M行:每行3个整数A,B,C。表示一个可能的线路要连接A、B两个牛棚,费用是C。
【输出格式】

只一行,一个整数,即花费最大的费用。如果不可能连接通所有牛棚,输出-1。
17 + 8 + 10 + 7 = 42

Sample Input

5 8
1 2 3
1 3 7
2 3 10
2 4 4
2 5 8
3 4 6
3 5 2
4 5 17

Sample Output

42

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t047

【题解】

题目其实是要让你求一棵最大生成树;
只要在做最小生成树的时候,把判断的”>”和”<”号换一下就可以了;
给的代码是普利姆算法的;
(中间如果有某个点不能连接,那么它的dis值会为初值)
(如果是克鲁斯卡尔算法的话,那么最后判断依据就是整张图是否联通)
(note:已经进入最小生成树的点不能再更新了!)

【完整代码】

#include <cstdio>
#include <vector>
using namespace std;

#define rei(x) scanf("%d",&x)
#define pb push_back
#define rep1(i,x,y) for (int i = x;i <= y;i++)

const int MAXN = 1e3+10;
int n,m,dis[MAXN],ans = 0;
vector <int> g[MAXN],w[MAXN];
bool bo[MAXN];

int main()
{
    //freopen("F:\rush.txt","r",stdin);
    rei(n);rei(m);
    rep1(i,1,m)
    {
        int x,y,z;
        rei(x);rei(y);rei(z);
        g[x].pb(y);w[x].pb(z);
        g[y].pb(x);w[y].pb(z);
    }
    rep1(i,1,n)
        dis[i] = -2;
    dis[1] = 0;
    while (true)
    {
        int ma = -1,k = -1;
        rep1(j,1,n)
            if (dis[j]>ma && !bo[j])
            {
                ma = dis[j];
                k = j;
            }
        if (k==-1)
            break;
        bo[k] = true;
        int len = g[k].size();
        rep1(j,0,len-1)
        {
            int y = g[k][j],cost = w[k][j];
            if (!bo[y] && dis[y]<cost)
                dis[y] = cost;
        }
    }
    rep1(i,1,n)
    {
        ans+=dis[i];
        if (dis[i]==-2)
        {
            ans = -1;
            break;
        }
    }
    printf("%d
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/AWCXV/p/7626691.html