HDoj-1863-畅通project-并查集

畅通project

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

Total Submission(s): 17006    Accepted Submission(s): 7140

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<string.h>
#include <algorithm>
using namespace std;
struct Road
{
    int c1, c2, cost;
};
Road road[110];

bool cmp(Road a,Road b)
{
    return a.cost<b.cost;
}
int city[110];

int find(int a)
{
    int r=a;
    while(city[r]!=r)
       r=city[r];
    return r;
}
bool merge(int x, int y)
{
    int fx,fy;
     fx = find(x);
     fy = find(y);
    if(fx == fy)   return 0;
    else if(fx < fy)
           city[fy] = fx;
    else
           city[fx] = fy;
return 1;
} 

int main()
{
    int n, m;
    while(scanf("%d %d", &m, &n) && m)
    {
        int i;
        for(i=1;i<=n;i++)
        {
            city[i]=i;
        }
        for(int i=0; i<m; ++i)
            scanf("%d %d %d", &road[i].c1, &road[i].c2, &road[i].cost);
        sort(road, road+m,cmp);
        int sum = 0, count = 0;
        for(int i=0; i<m; i++)
        {
            if(merge(road[i].c1, road[i].c2))
            {
                count ++;
                sum += road[i].cost;
            }
            if(count == n-1)
                break;
        }
        if(count == n-1)
            printf("%d\n", sum);
        else
            printf("?

\n");
    }
    return 0;
}
时间: 2024-08-29 22:55:52

HDoj-1863-畅通project-并查集的相关文章

hdu 1863 畅通工程 (并查集+最小生成树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 17593    Accepted Submission(s): 7417 Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交

1863 畅通工程-并查集最小生成树

题目链接 问题描述: 简单的最小生成树的题,将路径按cost从小到大排序,利用克鲁斯塔尔求最小生成树算法就行. 代码: 1 #include<iostream> 2 #include<queue> 3 #include<algorithm> 4 5 using namespace std; 6 struct Road 7 { 8 int beg; 9 int end; 10 int cost; 11 Road(int beg, int end, int cost) 12

hdu 1863 畅通工程 (并查集 、 kruskal)

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

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]

Kruskal HDOJ 1863 畅通工程

题目传送门 1 /* 2 此题为:HDOJ 1233 + HDOJ 1232 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 #include <cmath> 8 using namespace std; 9 10 const int MAX_N = 100 + 10; 11 int pre[MAX_N]; 12 int tot; 13 int sum; 14 st

HDU1232 畅通工程 并查集

这道题跟HDU 1213 How Many Tables 并查集非常接近,都是赤裸裸的并查集的题. 思路:假设还需要建n-1条路,每并一次就自减1. 参考代码: #include<stdio.h> int fa[1000]; int find(int u) { return fa[u]==u?u:fa[u]=find(fa[u]); } int main() { int i,n,m,u,v,x,y; scanf("%d%d",&n,&m); while (n

HDU 1232 畅通工程(并查集)

畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 30485    Accepted Submission(s): 16013 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有

&lt;hdu - 1863&gt; 畅通工程 并查集和最小生成树问题

本题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863  Problem Description: 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本.现请你编写程序,计算出全省畅通需要的最低成本.  Input: 测试输入包含若干测试用例.每个测试用例的第1行给出评估的道路条数 N.村庄数目M ( < 100

杭电1863畅通project

畅通project Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 21240    Accepted Submission(s): 9142 Problem Description 省政府"畅通project"的目标是使全省不论什么两个村庄间都能够实现公路交通(但不一定有直接的公路相连,仅仅要能间接通过公路可达就可以).经过

畅通工程(并查集模版题)

题意: 多组输入N,M,当N为0退出人输入,N是道路数目,M是村庄总数,随后N行,每行输入三个数两个村庄的编号,以及连接这两个村庄的费用.对每一组数据输出畅通工程的最低费用,如果不能畅通就输出“?”(不包括双引号) 这道题有两道链接: 一道是fjut的链接,另外一道是hdu的 http://www.fjutacm.com/Problem.jsp?pid=1214 http://acm.hdu.edu.cn/showproblem.php?pid=1863 思路:其实这道题就是一道排序+并查集题,