畅通工程

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

Total Submission(s): 29620    Accepted Submission(s): 15557

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.

分析:对于不同的道路和不同的城镇,很容易想到是图的连通问题,所谓并查集,合并后,进行查找,主要说一下查找函数,请看

int find(int x){

return set[x]=(set[x]==x?x:find(set[x]));

}
在一个就是需要最短边的话 首先就应该想到,一个N个顶点的图,想连通的话,

必须得有多少条边呢? 应该是N-1,然后再根据并查集,连一对边就减1,最后

连完也就出来答案了.
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>  

int N,M;//n代表点,m代表边
int set[1005];
int temp;  

int find(int x)
{
    return set[x]=(set[x]==x?x:find(set[x]));  

}
void merge(int a,int b)  //合并
{
    for(int i=1;i<=N;i++)
    {
        int x=find(a),y=find(b);
        if(x!=y)
        {
            set[x]=y;
            temp--;  //找到后就减1
        }
    }
}  

int main()
{
    while(scanf("%d%d",&N,&M),N!=0)
    {
        int a,b;
        temp=N-1;
        for(int j=1;j<=N;j++)
        {
            set[j]=j;
        }
        for(int i=1;i<=M;i++)
        {
            scanf("%d%d",&a,&b);
            merge(a,b);
        }
        printf("%d\n",temp);
    }
    return 0;
}  

利用少量的贪心:代码如下:

#include<stdio.h>
int bin[1002];
int findx(int x)
{
	int r=x;
	while(bin[r]!=r)
	r=bin[r];
	return r;
}
void merge(int x,int y)
{
	int fx,fy;
	fx=findx(x);
	fy=findx(y);
	if(fx!=fy)
	bin[fx]=fy;
}
int main()
{
	int i,n,m,x,y,count;
	while(scanf("%d",&n),n)
	{
		for(i=1;i<=n;i++)
		bin[i]=i;
		for(scanf("%d",&m);m>0;m--)
		{
			scanf("%d %d",&x,&y);
			merge(x,y);
		}
		for(count=-1,i=1;i<=n;i++)
			if(bin[i]==i)
			count++;
			printf("%d\n",count);
	}
}

最新文章

  1. JQuery 获取父级元素、同级元素、子元素等
  2. a版本冲刺第三天
  3. Integer to Roman -- LeetCode 012
  4. 安全关闭多Activity的Application
  5. ALTER 语句修改数据表
  6. Python学习(2)基本语法
  7. 117. Populating Next Right Pointers in Each Node II
  8. AMQP与QPID简介
  9. poj 1265 Area(Pick定理)
  10. php面向对象编程--学习笔记
  11. Scrapy爬虫大战京东商城
  12. win7与centos虚拟机的共享文件夹创建
  13. Object.defineProperty的理解
  14. JS常用工具函数(持续记录)
  15. PCL中分割方法的介绍(3)
  16. python中数据分析常用函数整理
  17. Java 继承和多态
  18. Python【time】模块
  19. su的使用与退出
  20. laravel4.2 Redis 使用

热门文章

  1. 在QEMU中调试ARM程序【转】
  2. Postgresql合并年月日、月份和日期左侧补零
  3. Cannot change version of project facet Dynamic Web Module to 2.5的解决
  4. angularJS入门笔记
  5. 开启CSP网页安全政策防止XSS攻击
  6. Spring boot集成swagger2
  7. 文件操作(open\read\write\close)
  8. J2EE进阶(十八)基于留言板分析SSH工作流程
  9. J2EE进阶(十六)Hibernate 中getHibernateTemplate()方法使用
  10. Android图表库MPAndroidChart(一)——了解他的本质,方能得心应手