zoukankan      html  css  js  c++  java
  • vijos P1190繁忙的都市(Kruskal)(最小生成树)

    P1190  繁忙的都市

    城市C是一个非常繁忙的大都市,城市 中的道路十分的拥挤,于是市长决定对其中的道路进行改造。城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路口之 间最多有一条道路相连接。这些道路是双向的,且把所有的交叉路口直接或间接的连接起来了。每条道路都有一个分值,分值越小表示这个道路越繁忙,越需要进行 改造。但是市政府的资金有限,市长希望进行改造的道路越少越好,于是他提出下面的要求:
    1.改造的那些道路能够把所有的交叉路口直接或间接的连通起来。

    2.在满足要求1的情况下,改造的道路尽量少。

    3.在满足要求1、2的情况下,改造的那些道路中分值最大的道路分值尽量小。

    任务:作为市规划局的你,应当作出最佳的决策,选择那些道路应当被修建。

    格式

    输入格式

    第一行有两个整数n,m表示城市有n个交叉路口,m条道路。接下来m行是对每条道路的描述,u, v, c表示交叉路口u和v之间有道路相连,分值为c。(1≤n≤300,1≤c≤10000)

    输出格式

    两个整数s, max,表示你选出了几条道路,分值最大的那条道路的分值是多少。

    样例1

    样例输入1[复制]

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

    样例输出1[复制]

    3 6
    【分析】水题,Kruskal就行。
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #include <climits>
    #include <cstring>
    #include <string>
    #include <set>
    #include <map>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <list>
    #include<functional>
    #define mod 1000000007
    #define inf 0x3f3f3f3f
    #define pi acos(-1.0)
    using namespace std;
    typedef long long ll;
    const int N=1005;
    
    struct Edg
    {
        int v,u;int w;
    }edg[300*300+50];
    bool cmp(Edg g,Edg h)
    {
        return g.w<h.w;
    }
    int n,m,k,cnt=1,maxn;
    int parent[N];
    void init()
    {
        for(int i=0;i<n;i++)parent[i]=i;
    }
    void Build()
    {
        int u,v,w;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&u,&v,&w);
            edg[i].u=u;edg[i].v=v;edg[i].w=w;
        }
        sort(edg,edg+m,cmp);
    }
    int Find(int x) {
        if(parent[x] != x) parent[x] = Find(parent[x]);
        return parent[x];
    }//查找并返回节点x所属集合的根节点
    void Union(int x,int y) {
        x = Find(x);
        y = Find(y);
        if(x == y) return;
        parent[y] = x;
    }//将两个不同集合的元素进行合并
    void Kruskal()
    {
        int sum=0;
        int num=0;
        int u,v;
        for(int i=0;i<m;i++)
        {
            u=edg[i].u;v=edg[i].v;
            if(Find(u)!=Find(v))
            {
                sum+=edg[i].w;
                maxn=max(maxn,edg[i].w);
                num++;
                Union(u,v);
            }
            if(num>=n-1){
                 printf("%d %d
    ",n-1,edg[i].w);
                 break;
            }
        }
    }
    int main() {
            scanf("%d%d",&n,&m);
            init();
            Build();
            Kruskal();
        return 0;
    }
    View Code
  • 相关阅读:
    汤姆猫解决打印日志乱码问题
    oracel如何将timestamp转化为date类型
    oracle排序分页
    批量删除某一后缀的临时表
    oracle分组排序后获取每组行号
    cxf中隐藏服务列表
    怎么从一张表中查询数据插入到另一张表中
    weblogic创建域
    java多线程
    Linux常用命令大全
  • 原文地址:https://www.cnblogs.com/jianrenfang/p/5728217.html
Copyright © 2011-2022 走看看