HDU1233 还是畅通工程 kruskal算法

F.A.Q
Hand In Hand
Online Acmers
Forum | Discuss
Statistical Charts
Problem Archive
Realtime Judge Status
Authors Ranklist
 
     C/C++/Java Exams     
ACM Steps
Go to Job
Contest LiveCast
ICPC@China
Best Coder beta
VIP | STD Contests
Virtual Contests
    DIY | Web-DIY beta
Recent Contests

还是畅通工程

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 55271    Accepted Submission(s): 25114


Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
 

Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
 

Output
对每个测试用例,在1行里输出最小的公路总长度。
 

Sample Input
 
      
3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
 

Sample Output
 
      
3 5
Hint
Hint
Huge input, scanf is recommended.
 

Source
 

Recommend
JGShining   |   We have carefully selected several similar problems for you:   1232  1875  1879  1301  1162 
 

Statistic |  Submit |  Discuss | Note
Hangzhou Dianzi University Online Judge 3.0
Copyright © 2005-2018 HDU ACM Team. All Rights Reserved.
Designer & Developer : Wang Rongtao LinLe GaoJie GanLu
Total 0.004000(s) query 5, Server time : 2018-05-07 20:34:59, Gzip enabled

思路:

将所有边放入一个最小堆中,每次取出权重最小的边,看边的两个端点是否属于同一个集合,
不属于同一个集合就加入这条边,否则就舍弃,这种贪心的选择就是kruskal算法

//#include<bits/stdc++.h>
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=120;
struct edge{
int a,b,weight;
bool friend operator < (edge x,edge y)
{
        return x.weight>y.weight;
}
};
int pre[maxn];
int get_parent(int x)
{
    if(pre[x]==-1)  return x;
    return pre[x]=get_parent(pre[x]);
}
bool mix(int x,int y)
{
    int fx=get_parent(x),fy=get_parent(y);
    if(fx==fy)
        return 1;
    pre[fx]=fy;
    return 0;
}
priority_queue<edge> q;
int kruskal()
{
    int cost=0;
    while(!q.empty()){
        edge x=q.top();
        q.pop();
        if(!mix(x.a,x.b))
            cost+=x.weight;
    }
    return cost;
}
int main()
{
	ios::sync_with_stdio(false);
    int n;
    while(scanf("%d",&n)!=EOF&&n)
    {
        memset(pre,-1,sizeof(pre));
        int m=(n*(n-1))/2;
        edge e;
        for(int i=0;i<m;i++)
            {
                cin>>e.a>>e.b>>e.weight;
                q.push(e);
            }
        cout<<kruskal()<<endl;
    }
	return 0;
 }

猜你喜欢

转载自blog.csdn.net/qq_40507857/article/details/80231123
今日推荐