zoukankan      html  css  js  c++  java
  • 【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;
    }
    
  • 相关阅读:
    第一次作业
    第五次作业
    第三次作业
    第六次作业
    第二次作业
    scikitlearn学习 决策树
    [阅读]Think Python CH3 Functions
    [阅读]Think Python CH2 Variables, Expressions, and Statements
    [阅读]Think Python CH1 The Way of the Program
    Hive操作符和函数
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626691.html
Copyright © 2011-2022 走看看