ACM-最小生成树之继续畅通工程——hdu1879

***************************************转载请注明出处:http://blog.csdn.net/lttree***************************************

继续畅通工程

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 12918    Accepted Submission(s): 5587

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年

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1879

继续畅通工程,最小生成树(MST)。

不说最小生成树,直接说MST,是不是显得高大上啊~

嘿嘿~~~

这道题,依旧是求最小生成树,比起赤裸裸加了几块布。

比如,有些路已经修建了。

已经修建的路就不需要耗费你任何东西,所以cost=0

没有告诉你边数有多少,

其实题目中说了 边数=n*(n-1)/2

剩下的,求MST吧~ ,我用的Kruskal求:

/****************************************
*****************************************
*        Author:Tree                    *
*From :http://blog.csdn.net/lttree      *
* Title : 继续畅通工程                 *
*Source: hdu 1879                       *
* Hint  : 最小生成树(MST-Prim)       *
*****************************************
****************************************/

#include <stdio.h>
#include <algorithm>
using namespace std;
struct Road
{
    int u,v,c;
}r[10001];
int n,m,father[10001];
bool cmp(Road r1,Road r2)
{
    return r1.c<r2.c;
}

// 并查集系列函数  1-初始化 2-查找 3-合并
void Init( int n )
{
    int i;
    for(i=1;i<=n;++i)
        father[i]=i;
}
int Find(int m)
{
    while( father[m]!=m )
    {   m=father[m];    }
    return m;
}
void Combine( int a,int b)
{
    int temp_a,temp_b;
    temp_a=Find(a);
    temp_b=Find(b);

    if( temp_a!=temp_b )
        father[temp_a]=temp_b;
}

int Kruskal( void )
{
    sort(r,r+m,cmp);
    Init(n);
    Road rd;
    int i,res;

    // 构建最小生成树
    res=0;
    for( i=0;i<m;++i )
    {
        rd=r[i];
        if( Find(rd.u)!=Find(rd.v) )
        {
            Combine(rd.u,rd.v);
            res+=rd.c;
        }
    }
    return res;
}

int main()
{
    int i,start,finish,cost,iscon;

    while( scanf("%d",&n) && n )
    {
        // 求边的数量
        m = n*(n-1)/2;
        for( i=0;i<m;++i )
        {
            scanf("%d%d%d%d",&start,&finish,&cost,&iscon);
            r[i].u=start;
            r[i].v=finish;
            // 如果道路已经修建,消耗设置为0,不需要我们再去建立道路
            if( iscon ) r[i].c=0;
            else    r[i].c=cost;
        }
        printf("%d\n",Kruskal());
    }
    return 0;
}

ACM-最小生成树之继续畅通工程——hdu1879

时间: 2024-10-27 10:44:54

ACM-最小生成树之继续畅通工程——hdu1879的相关文章

继续畅通工程--hdu1879

继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 17840    Accepted Submission(s): 7682 Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城

继续畅通工程--hdu1879(最小生成树 模板题)

http://acm.hdu.edu.cn/showproblem.php?pid=1879 刚开始么看清题  以为就是n行  后来一看是n*(n-1)/2行   是输入错误  真是够够的 #include <iostream> #include <cstring> #include <algorithm> #include <queue> #include <cstdio> #include <cstdlib> #include &

HDU 1863 (最小生成树之Kruskal) 畅通工程

模板题,学习一下最小生成树的Kruskal算法 对于稀疏图来说 按所给的边的权值从小到大排序,如果该边不与已经选的边形成环就选择它 这里用并查集来实现 第i条边的端点放在u.v数组中,权值保存在w中 这里用的是间接排序,也就是排的是每条边的序号,放在rank数组中 1 //#define LOCAL 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std;

HDU1879 继续畅通工程 【最小生成树Prim】

继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 13613    Accepted Submission(s): 5906 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列

ACM: 继续畅通工程-并查集-最小生成树-解题报告

继续畅通工程 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态.现请你编写程序,计算出全省畅通需要的最低成本. Input 测试输入包含若干测试用例

ACM: 还是畅通工程-并查集-最小生成树-解题报

还是畅通工程 Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小.请计算最小的公路总长度. Input 测试输入包含若干测试用例.每个测试用例的第1行给出村庄数目N ( <

hdoj 1863 畅通工程 【最小生成树】+【kruskal】

题意:... 难点:如何判断是不是信息不全:在输入的时候建立并查集,之后判断有几个节点就可以了,剩下的就是kruskal算法. 代码: #include<stdio.h> #include<string.h> #include<algorithm> #define MAXN 105 #define INF 0x3f3f3f3f using std::sort; struct node{ int from; int to; int w; }edges[MAXN*MAXN]

HDOJ 1233 还是畅通工程 【最小生成树】+【prim】

题意:... 策略:最最典型的prim算法. 代码: #include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f #define MAXN 105 int map[MAXN][MAXN], di[MAXN], vis[MAXN]; int n; int prim() { int i, j, min, pos; memset(vis, 0, sizeof(vis)); memset(di, 0, sizeof(di)); p

HDU 1233 还是畅通工程【最小生成树入门题,Kruskal算法+Prim算法】

还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 39929    Accepted Submission(s): 18144 Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路