HDN通畅工程

畅通工程

Problem Description

某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?

Input

测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。

注意:两个城市之间可以有多条道路相通,也就是说

3 3

1 2

1 2

2 1

这种输入也是合法的

当N为0时,输入结束,该用例不被处理。

Output

对每个测试用例,在1行里输出最少还需要建设的道路数目。

Sample Input

4 2
1 3
4 3
3 3
1 2
1 3
2 3
5 2
1 2
3 5
999 0
0

Sample Output

1
0
2
998

Hint

Hint

Huge input, scanf is recommended.

Source

浙大计算机研究生复试上机考试-2005年

Recommend

JGShining

没学并查集的时候,这题根本没思路,于是百度了一下,看了PPT,于是就略懂了,要学的百度找PPT吧!!

#include <stdio.h>
int b[10001];
int findx(int x)
{
    int r;
    r=x;
    while(r!=b[r])
        r=b[r];
    return r;
}
void merge(int x,int y)
{
    int fx,fy;
    fx=findx(x);
    fy=findx(y);
    if(fx!=fy)
        b[fx]=fy;
}
int main()
{
    int x,m,n,y,i,j;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        if(n==0) break;
        for(i=1;i<=n;i++)
        {
            b[i]=i;
        }
        while(m--)
        {
            scanf("%d %d",&x,&y);
            merge(x,y);
        }
        j=-1;
        for(i=1;i<=n;i++)
        {
            if(b[i]==i) j++;
        }
        printf("%d\n",j);
    }
    return 0;
}
时间: 2024-10-09 18:42:14

HDN通畅工程的相关文章

hdu 1874 通畅工程续

Description某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. Input本题目包含多组数据,请处理到文件结束.每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目 和 已修建的道路的数目.城镇分别以0-N-1编号.

hdu 1863 通畅工程

Description省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本.现请你编写程序,计算出全省畅通需要的最低成本. Input测试输入包含若干测试用例.每个测试用例的第1行给出评估的道路条数 N.村庄数目M ( < 100 ):随后的 N行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数).为简单起见,

【并查集】通畅工程(航电1232)

转自:http://blog.csdn.net/dellaserss/article/details/7724401/(并查集的讲解非常有趣) Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可).问最少还需要建设多少条道路? Input 测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分

HDU1232——通畅工程(并查集)

http://acm.hdu.edu.cn/showproblem.php?pid=1232 这道题是学习并查集的第一道题. 并查集,他的思路是构成一个树结构,如果这两个节点的根节点相同,那么说明这两个节点在一个集合里,否则不再一个集合. 查找根节点:当然是递归查找他上一层的父节点是什么.知道查找到的节点的父节点是他本身为止. int find(int x) { return par[x] == x ? x : par[x] = find(par[x]); } 将节点加入集合:为了方便查找,直接

通畅工程续 【Floyd】

Problem Description某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. Input本题目包含多组数据,请处理到文件结束.每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目.城镇分别以0-N

杭电1233——还是通畅工程~简单最小生成树问题

这题,典型的最小生成树问题,可以用Kruskal算法来实现,配合着并查集来高效求解. 先将各边按权值进行从小到大排列.遍历一个各边便可求解,时间复杂度为O(|E|log|V|),其中E为边的个数,V为顶点数. 下面是AC代码,代码中有注释: #include <iostream> #include <cstdio> #include <algorithm> using namespace std; class data { public: int from, to, c

hdu--1232 继续通畅工程

wa了8次,超级崩溃,险些自闭,不过倒是学到了很多,先来一段代码: #include<bits/stdc++.h> using namespace std; int p[1000]; //储存查并集 int n,m; struct node{ //数组结构体,排序距离 int a,b; int d; }v[100000]; bool cmp(node x,node y) { return x.d<y.d; } int find(int x) { int re=x; while(p[re]

考研上机水题整理——浙大2006

题目1019:简单计算器 栈的比较经典的运用,记得用栈,队列和容器的时候,要清空,其次就是用栈的基本套路,取值,弹出,推入,输出 1 #include<stdio.h> 2 #include<stack> 3 using namespace std; 4 5 int main() 6 { 7 int a,b; 8 char c,d; 9 stack <double> s; 10 while(~scanf("%d ",&a)&&

信息检索

<信息检索>是图书馆学专业的基础性核心课程,主要讲授信息检索的基本理论与常用方法.国内外重要的搜索引擎.综合性信息检索与资源发现系统.专题信息检索.信息检索的应用.融合课堂讲授.检索案例分析.课外检索实践.知识竞赛等多种教学形式,提高学生的信息素养和灵活运用信息解决问题的能力. 课程概述 1.课程性质与定位  本课程作为图书馆学专业本科生必修的专业核心课,同时也是一门实践性.操作性.应用性很强的课程. 2.课程目标  本课程旨在培养学生的信息素养.要求学生了解信息检索的基本概念与原理,熟悉网络