• HDU_1879_继续畅通工程


    继续畅通工程

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 16654    Accepted Submission(s): 7157


    Problem Description
    省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
     
    Input
    测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。

    当N为0时输入结束。
     
    Output
    每个测试用例的输出占一行,输出全省畅通需要的最低成本。
     
    Sample Input
    3
    1 2 1 0
    1 3 2 0
    2 3 4 0
    3
    1 2 1 0
    1 3 2 0
    2 3 4 1
    3
    1 2 1 0
    1 3 2 1
    2 3 4 1
    题解:
    并查集 贪心
    代码:
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    struct Path
    {
        int x,y;
        int cost;
    } path[5000];
    bool cmp(Path a,Path b)
    {
        if(a.cost<b.cost)
            return 1;
        return 0;
    }
    int father[5000];
    int find(int a)
    {
        if(father[a]!=a)
            father[a]=find(father[a]);
        return father[a];
    }
    void merge(int a,int b)
    {
        int x,y;
        x=find(a);
        y=find(b);
        if(x!=y)
            father[x]=y;
    }
    int main()
    {
        int n,t;
        int a,b,c,d;
        int sum=0;
        while(1)
        {
            cin>>n;
            if(n==0)
                break;
            t=n*(n-1)/2;
            int i=0,j,k=0;
            for(j=1; j<=n; j++)
                father[j]=j;
            while(t--)
            {
    
                sum=0;
                cin>>a>>b>>c>>d;
                if(d==1)
                {
                    merge(a,b);
                }
                else
                {
                    path[i].x=a;
                    path[i].y=b;
                    path[i].cost=c;
                    i++;
                }
            }
    
            sort(path,path+i-1,cmp);  //将未连通的道路按jia'ge2从小到大进行排序
            int cnt1=i,cnt2=0,cnt3=0;
            for(i=1; i<=n; i++)
                if(father[i]==i)
                    cnt2++;
            for(j=0; j<cnt1; j++)
            {
                if(find(path[j].x)!=find(path[j].y))
                {
                    sum+=path[j].cost;
                    merge(path[j].x,path[j].y);
                }
            }
            cout<<sum<<endl;
        }
    
        return 0;
    }
    

      

    0
     
    Sample Output
    3
    1
    0
     
    Author
    ZJU
     
    Source
     
  • 相关阅读:
    02-0. 整数四则运算(10)
    中国大学MOOC-翁恺-C语言程序设计习题集
    树链剖分
    最小生成树---Prim
    最短路-spfa
    并查集
    Latex学习笔记 第一章
    Javaweb常用解决问题连接
    毕业论文如何排版
    毕业论文指之 “国内外研究现状”的撰写
  • 原文地址:https://www.cnblogs.com/jasonlixuetao/p/4530610.html
Copyright © 2020-2023  润新知