• 畅通project(杭电1863)


    畅通project

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 17882    Accepted Submission(s): 7561


    Problem Description
    省政府“畅通project”的目标是使全省不论什么两个村庄间都能够实现公路交通(但不一定有直接的公路相连,仅仅要能间接通过公路可达就可以)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编敲代码,计算出全省畅通须要的最低成本。
     

    Input
    測试输入包括若干測试用例。

    每一个測试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N 
    行相应村庄间道路的成本,每行给出一对正整数,各自是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见。村庄从1到M编号。当N为0时。所有输入结束。相应的结果不要输出。

     

    Output
    对每一个測试用例,在1行里输出全省畅通须要的最低成本。

    若统计数据不足以保证畅通,则输出“?”。

     

    Sample Input
    3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100
     

    Sample Output
    3 ?

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int pre[105];
    struct st
    {
        int a,b;
        int p;
    }data[105]; 
    int find(int n)     //找结点的根; 
    {
        return pre[n]==n?n:pre[n]=find(pre[n]);
    }
    int join(int x,int y)   //
    {
        int fx=find(x),fy=find(y);
        if(fx!=fy)        //假设两结点的根并不是为同一个点。连接起来。 
        {
            pre[fx]=fy;
            return 1;
        }
        return 0;
    }
    int cmp(st a,st b)   //将修路的价钱按升序排列。 
    {
        return a.p<b.p;
    } 
    int main()
    {
        int i,m,n;
        while(~scanf("%d %d",&m,&n),m)
        {
            for(i=1;i<=n;i++)   //将结点独立(初始化); 
            {
                pre[i]=i;
            }
            for(i=1;i<=m;i++)
            {
                scanf("%d %d %d",&data[i].a,&data[i].b,&data[i].p);
            }
            sort(data+1,data+m+1,cmp);  //从i=1排序,n个数据,所以是sort(data+1,data+m+1,cmp); 
            int sum=0,ans=0;
            for(i=1;i<=m;i++)    
            {
                if(join(data[i].a,data[i].b)) //假设两节点的根为同一个根,则不须要修路,反之选修路花费较少的一条路(排序的作用)。 
                {
                    sum+=data[i].p;
                }
            }
            for(i=1;i<=n;i++)  //统计剩下孤立点的个数。间接统计须要修多少路。 
            {
                if(pre[i]==i)
                {
                    ans++;
                }
            }
            if(ans>1)
            printf("?

    "); else printf("%d ",sum); } return 0; }



  • 相关阅读:
    Linux内核基础--事件通知链(notifier chain)good【转】
    10 个迅速提升你 Git 水平的提示【转】
    notifier chain — 内核通知链【转】
    内核通知链 学习笔记 【转】
    Linux内核基础--事件通知链(notifier chain)【转】
    Git 使用规范流程【转】
    Linux中断(interrupt)子系统之二:arch相关的硬件封装层【转】
    学习 Linux,101: 自定义或编写简单脚本【转】
    MySQL数据处理函数
    Effective JavaScript Item 36 实例状态仅仅保存在实例对象上
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5157982.html
Copyright © 2020-2023  润新知