SDAU练习四 1003

来源:互联网 发布:php购物网站源码mysql 编辑:程序博客网 时间:2024/05/18 03:19

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

解题思路:题目大意就是求可以最少多少条线把子连通图连起来使其成为一个大的连通图。这道题用并查集的方法将每个子连通图表示成每个独立的集合,然后求有多少个集合即可。难点就在于如何表示成集合。首先创建数组,初始化时候看城镇的个数,数组的标号等于数组的值,表示每个城镇对应的是不同的集合,也就是一开始每个城镇都是独立的个体,然后开始添加道路。输入2个城镇,首先找到每个城镇的集合号,如果这两个城镇的集合号相同,那么表示着2个城镇是互通的,不需要再动了;如果不相同,表示他们有着共同的双亲,将一个城镇的集合号数作为城镇赋值给另个城镇的集合号数的集合号,简而言之就是并入同一个集合,他们是祖先也就成为了集合号数,也就是树的根节点。对于输出,判断有都是个独立的集合即可。

做题感想:感觉是一个新的东西,一开始有点难接受,不是特别明白,而且只讲了一个例题,觉得有点疑惑,这个方法是不是只是针对一特定的题目,适用性好像不是很强,最后代码有借鉴成分。

AC代码:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include<iostream>  
  2. using namespace std;  
  3. int arr[1000];  
  4. int find(int x)  
  5. {  
  6.     int r=x;  
  7.     while(arr[r]!=r)  
  8.        r=arr[r];  
  9.     return r;  
  10. }  
  11. void merge(int x,int y)  
  12. {  
  13.     int a,b;  
  14.       a=find(x);  
  15.       b=find(y);  
  16.     if(a!=b)  
  17.       arr[a]=b;  
  18. }  
  19. int main()  
  20. {  
  21.   
  22.     int i,a,b;  
  23.     int x,y;  
  24.     int count;  
  25.     while(cin>>a)  
  26.     {  
  27.         if(a)  
  28.         {  
  29.             cin>>b;  
  30.             count=0;  
  31.             for(i=1;i<=a;i++)  
  32.              arr[i]=i;  
  33.             for(i=1;i<=b;i++)  
  34.             {  
  35.                 cin>>x>>y;  
  36.                merge(x,y);  
  37.             }  
  38.            for(count=-1,i=1;i<=a;i++)  
  39.              if(arr[i]==i)  
  40.                count++;  
  41.         cout<<count<<endl;  
  42.         }  
  43.     }  
  44.     return 0;  
  45. }  
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子被开水烫了怎么办 小儿喝开水烫了怎么办 小孩不识字怎么办17-18 3岁宝宝不识数字怎么办 小孩数字写反了怎么办 3岁宝宝乱啃东西怎么办 闹钟的指针松了怎么办 手机想让它横屏怎么办 教孩子写作业头都被气炸了怎么办 2岁宝宝大小脸怎么办 宝宝2岁半不认识颜色怎么办 宝宝11个多月突然排斥妈妈怎么办 5个月婴儿粘妈妈怎么办 3岁宝宝记不住颜色怎么办 3岁宝宝不认字怎么办 墙纸被宝宝弄上各种颜色怎么办 三周半的孩子不认识数字怎么办 3岁幼儿不会数数怎么办 四岁宝宝不认识数字怎么办 三岁宝宝不认识数字怎么办 4岁半了不认识数字怎么办 5岁小朋友数字不认识怎么办 孩子读一年级字都不识几个怎么办 宝宝二周多了不分颜色怎么办 4岁儿童手指脱皮怎么办 孩子老是不会写2怎么办 宝宝胃浅容易吐怎么办 农村户口小孩去城里读书怎么办 小孩从城市回农村读书怎么办 天冷了怎么办教案反思 小孩上幼儿园不爱学习怎么办 曰光灯管监控要反光怎么办 立邦乳胶漆墙面脏了怎么办 橱柜门黑色边颜色花了怎么办 地板上有真实漆怎么办 吸了泡泡球的气怎么办 办公室上班坐着太累怎么办 金雀盆景生虫怎么办 租的房子墙脏怎么办 租住个厕所对着卧室怎么办 农村的房子没有房产证怎么办