码迷,mamicode.com
首页 > 其他好文 > 详细

swjtuoj2433 Magic Mirror

时间:2018-04-23 00:13:42      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:span   frame   gic   review   bsp   合并   row   esc   ber   

Magic Mirror is an artificial intelligence system developed by TAL AI LAB,It can determine human based on human bone information.

Meternal use the magic mirror API,then he found after he input some photo to the system,it will output the two endpoint features of each bone of the human body.

a bone can be described by a integer pair like (1,2) represent this bone consists of endpoint 1 and endpoint 2 .

We can think that everyone’s bones endpoint features are unique.

But when using the magic mirror‘s API, Meternal broke all the order, and now you need to help him determine the endpoint features that each person has.

The system may contain some unused information which never included in any bone,please skip them.

The data contains n types of endpoints and m bones which described by a pair.

The first line contains two integer n(1n200000) and m(1m200000) ,the number of endpoint and bones.
The following m lines,
each line contains two integer a(1an) and b(1bn),the features of two endpoint of this bone.

The output contains some lines of bone endpoint information.

Please output the information of each person in according order by the smallest endpoint number of this person.
For the i-th line information first outputs the number k, the endpoint contained by this person.

then outputs k endpoint number in ascending order.

When the output is complete, output a line "Finish".
please skip unused endpoint.

6 4
1 3
2 5
3 3
3 4
3 1 3 4
2 2 5
Finish

==========================================================================================================
思路:本题考查查并集的基本操作,输出时要求一个集合一个集合输出,集合内的输出顺序为从小到大,集合间的顺序以集合最小元素按升序输出。
可选用vector来存储一个集合,将元素从小到大遍历,每找到一个未输出的集合,便找到相应的vector输出里面的全部元素。最后一行输出Finish。
注意点:
  • 直接暴力搜索每一个元素会超时,将每个集合放在一起可避免无效搜索。
  • 两个根节点相同时合并时,会出现错误,不要忘记在合并前判定其根节点是否相等。
 1 #include<stdio.h>
 2 #include<vector>
 3 using namespace std;
 4 
 5 const int Maxn = 200005;
 6 int set[Maxn];
 7 vector<int> ans[Maxn];
 8 int sign[Maxn];
 9 void init(){
10     for(int i = 0; i  <  Maxn; i++){
11         set[i] = -1;
12     }
13 
14 }
15 
16 int Find(int d1){
17     if(set[d1] < 0){
18         return d1;
19     }
20     set[d1] = Find(set[d1]);     //路径压缩
21     return set[d1];
22 }
23 
24 void Union(int d1,int d2){
25      int root1 = Find(d1);
26     int root2 = Find(d2);
27     if(root1==root2){
28         return;
29     }
30     if(set[root1] > set[root2]){   //按秩归并
31         set[root2] += set[root1];
32         set[root1] = root2;
33     }else{
34         set[root1] += set[root2];
35         set[root2] = root1;
36     }
37     return ;
38 }
39 
40 
41 int main(){
42     init();
43     int n,m;
44     scanf("%d %d",&n,&m);
45     while(m--){
46            int d1,d2;
47         scanf("%d %d",&d1,&d2);
48         Union(d1,d2);
49     }
50 
51     for(int i = 1; i < Maxn; i++){
52         ans[Find(i)].push_back(i);
53 
54     }
55     for(int i = 1; i < Maxn ; i++){
56         if(sign[Find(i)] == 1||set[Find(i)] > -2){
57             continue;
58         }
59         sign[Find(i)] = 1;
60         printf("%d", -set[Find(i)]);
61         for(int j = 0; j < ans[Find(i)].size();j++){
62             printf(" %d",ans[Find(i)][j]);
63         }
64         printf("\n");
65     }
66     printf("Finish");
67 }

 

swjtuoj2433 Magic Mirror

标签:span   frame   gic   review   bsp   合并   row   esc   ber   

原文地址:https://www.cnblogs.com/jinjin-2018/p/8910204.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!