最小生成树之继续畅通project

***************************************转发请注解出处:http://blog.csdn.net/lttree***************************************

=

接轨畅通project

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

Problem Description

省府“畅通project”的靶子是使全省不论什么五个村庄间都可以实现公路交通(但不必然有平素的公路相接,仅仅要能直接通过公路可达就能够)。

现得到城镇征程计算表,表中列出了任性两城市和市镇间建筑道路的花销,以及该道路是或不是曾经修通的图景。现请你编敲代码,总计出全省交通须求的最低资本。

 

Input

測试输入包含若干測试用例。

wwwlehu6.vip乐虎官网,每1个測试用例的第二行提交村庄数目N ( 一< N < 十0 );随后的 N(N-1)/2行相应村庄间道路的财力及建筑状态,每行给伍个正整数,各自是八个山村的编号(从壹编号到N),此两村庄间道路的资本。以及建筑状态:壹代表已建,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

武大计算机博士复试上机考试-二〇一〇年

 

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

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

不说最小生成树,直接说MST。是否显得高大上啊~wwwlehu6.vip乐虎官网 1

wwwlehu6.vip乐虎官网 2

wwwlehu6.vip乐虎官网 3

嘿嘿~~~

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

假定,有个别路1度建造了。

早就建造的路就不须求开销你不论什么东西。所以cost=0

尚未告知你边数有微微。

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

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

/****************************************
*****************************************
*        Author:Tree                    *
*From :http://blog.csdn.net/lttree      *
* Title : 继续畅通project                 *
*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;
}
You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图