zoukankan      html  css  js  c++  java
  • 继续畅通工程

    继续畅通工程

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 244 Accepted Submission(s): 175
     
    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
    0
     
    Sample Output
    3
    1
    0
     
    Author
    ZJU
     
    Source
    浙大计算机研究生复试上机考试-2008年
     
    #include<bits/stdc++.h>
    #define N 110
    using namespace std;
    struct node
    {
        int u,v,val;
        node(){}
        node(int a,int b,int c)
        {
            u=a;
            v=b;
            val=c;
        }
        bool operator <(const node & a) const
        {
            return val<a.val;
        }
    };
    vector<node>edge;
    int n;
    int x,y,val,f;
    int bin[N];
    int findx(int x)
    {
        while(x!=bin[x])
            x=bin[x];
        return x;
    }
    void init()
    {
        for(int i=0;i<=n;i++)
        {
            bin[i]=i;
        }
        edge.clear();
    }
    int main()
    {
        //freopen("C:\Users\acer\Desktop\in.txt","r",stdin);
        while(scanf("%d",&n)!=EOF&&n)
        {
            init();
            for(int i=0;i<n*(n-1)/2;i++)
            {
                scanf("%d%d%d%d",&x,&y,&val,&f);
                if(f)
                {
                    int fx=findx(x);
                    int fy=findx(y);
                    if(fx!=fy)
                        bin[fy]=fx;
                }
                else
                    edge.push_back(node(x,y,val));
            }
            sort(edge.begin(),edge.end());
            long long cur=0;
            for(int i=0;i<edge.size();i++)
            {
                int fx=findx(edge[i].u);
                int fy=findx(edge[i].v);
                if(fx!=fy)
                {
                    cur+=edge[i].val;
                    bin[fy]=fx;
                }
            }
            printf("%lld
    ",cur);
        }
        return 0;
    }
  • 相关阅读:
    Lync二次开发
    Socket 一对多通信
    DBImport V3.1 数据互导工具及文档生成器更新发布
    Sql学习第六天——SQL 巩固练习(用到了前几天几个知识点)
    文件监控
    Google Protocol Buffers 入门
    [原]常用Linux命令总结[Thx for commandlinefu]
    清理SQL Server日志释放文件空间
    ASP.NET MVC动态二级域名及ASP.NET管道机制
    搜索引擎——JobSearch简介
  • 原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/6143751.html
Copyright © 2011-2022 走看看