初学并查集-4:6个朋友

题目描述 Description

有这么一种说法:认识6个人,你就认识全世界的人。

Aiden现在有一张关系图,上面记载了N个人之间相互认识的情况。Aiden想知道,他能否只认识6个人就能间接认识这N个人呢?

输入描述 Input Description

第一行,两个数N,M,表示有N个人,M对认识关系。

接下来的M行,每行两个数ai,bi,表示ai与bi相互认识。

不保证认识关系不出现重复,保证ai≠bi。

N个人的编号为1...N。

输出描述 Output Description

若只认识6个人就能间接认识这N个人,则输出“^_^”。

若不行,则第一行输出“T_T”,第二行输出认识6个人最多能间接认识的人的个数。

输出不包括引号。

样例输入 Sample Input

6 7

1 2

1 3

2 4

3 5

4 6

5 6

3 2

样例输出 Sample Output

^_^

数据范围及提示 Data Size & Hint

对于30%的数据,保证0<n≤1000。

对于50%的数据,保证0<n≤5000。

对于100%的数据,保证0<n≤10000,m≤10*n。

type r=record
       num,v:longint;
       end;

var i,j,k,l:longint;
    father:array[1..10000]of longint;
    n,m:longint;
    x,y:longint;
    cost:array[1..10000]of r;
    num:array[1..10000]of integer;
    used:array[1..10000]of boolean;

function find(x:longint):longint;
         begin if father[x]=x
                  then exit(x);
               father[x]:=find(father[x]);
               exit(father[x]);
         end;

procedure union(x,y:longint);
          begin father[find(x)]:=find(father[y]);
          end;

procedure choose;
          var i,j,k:longint;
              max,maxx:longint;
          begin for i:=1 to 6 do
                    begin max:=0;
                          for j:=1 to n do
                              if (cost[j].num>max)and(not used[j])
                                 then begin max:=cost[j].num;
                                            maxx:=j;
                                      end;
                          used[maxx]:=true;
                          l:=l+max;
                    end;
          end;

begin readln(n,m);
      fillchar(father,sizeof(father),0);
      for i:=1 to n do
          father[i]:=i;
      for i:=1 to m do
          begin readln(x,y);
                if find(x)<>find(y)
                   then union(x,y);
          end;
      fillchar(cost,sizeof(cost),0);
      fillchar(num,sizeof(num),0);
      fillchar(used,sizeof(used),false);
      for i:=1 to n do
          inc(num[find(i)]);
      k:=0;
      for i:=1 to n do
          if num[i]<>0
             then begin inc(k);
                        cost[k].v:=i;
                        cost[k].num:=num[i];
                  end;
      l:=0;
      if k<=6
         then begin writeln(‘^_^‘);
                    halt;
              end
         else begin choose;
                    writeln(‘T_T‘);
                    writeln(l);
              end;
end.
时间: 2024-11-10 00:23:50

初学并查集-4:6个朋友的相关文章

初学并查集-1:家族

题目描述 Description 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚.如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚. 输入描述 Input Description 第一行:三个整数n,m,p,(n<=5000,m<=5000,p<=5000),分别表示有n个人,m个亲戚关系,询问p对亲戚关系. 以下m行:每行两个数Mi,Mj,

初学并查集-2:最优布线问题

题目描述 Description 学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的.为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地通过其他计算机实现和另外一台计算机连接. 为了使得任意两台计算机之间都是连通的(不管是直接还是间接的),需要在若干台计算机之间用网线直接连接,现在想使得总的连接费用最省,让你编程计算这个最小的费用. 输入描述 Input Description 输入第一行为两个整数n,m(2<=n<=100000,2<=m<

初学并查集-3:浴火银河星际跳跃

题目描述 Description 小 K 又在玩浴火银河了...不过这次他的目的不是跑运输赚钱,而 是做任务赚钱. 他想知道关于一个任务的两个星系是否可以连通. 输入描述 Input Description 第一行,三个数,X,N,M X 表示出现的星系代号的最大值: N 表示有 N 个星际跳跃门; M 表示有 M 个任务. 接下来的 N 行描述每个星际跳跃门:每行为两个数字(星系代号), 星际跳跃门连通这两个星系(星际跳跃门是可以双向通行的) : 接下来的 M 行表示每个任务需要到达的星系,每

swust oj 1091--土豪我们做朋友吧(并查集,最值维护)

题目链接:http://acm.swust.edu.cn/problem/1091/ Time limit(ms): 1000 Memory limit(kb): 32768 人都有缺钱的时候,缺钱的时候要是有个朋友肯帮助你,那将是一件非常幸福的事情.有N个人(编号为1到N),一开始他们互相都不认识,后来发生了M件事情,事情分为2个种类,1:A和B成为了朋友,并且A的所有朋友都成了B的朋友,B的所有朋友也都成了A的朋友.2:A缺钱了,请求帮助,他需要向他朋友中钱最多的请求帮助,若不止一位,选择编

7-25 朋友圈(25 分)(并查集的应用)

某学校有N个学生,形成M个俱乐部.每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈.一个学生可以同时属于若干个不同的俱乐部.根据"我的朋友的朋友也是我的朋友"这个推论可以得出,如果A和B是朋友,且B和C是朋友,则A和C也是朋友.请编写程序计算最大朋友圈中有多少人. 输入格式: 输入的第一行包含两个正整数N(≤30000)和M(≤1000),分别代表学校的学生总数和俱乐部的个数.后面的M行每行按以下格式给出1个俱乐部的信息,其中学生从1~N编号: 第i个俱乐部的人数Mi(空格)学

并查集初学(3)无间道之并查集 &amp;&amp; POJ2542 &amp;&amp; POJ1611

1.hihocoder上面讲的一道题 无间道之并查集 水题,精髓在于使用map容器进行打标签 #include <cstdio> #include <cstring> #include <iostream> #include <string> #include <map> #include <algorithm> using namespace std; const int maxn=10005; int p[maxn]; map&l

HDU3081Marriage Match II(二分答案+并查集+最大流SAP)经典

Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2507    Accepted Submission(s): 856 Problem Description Presumably, you all have known the question of stable marriage match. A

并查集详解(转)

并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了.以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定.不分享出来真是对不起party了.(party:我靠,关我嘛事啊?我跟你很熟么?) 来看一个实例,杭电1232畅通工程 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的.最后要解决的是整幅图的连通性问题.比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有几个连通分支,也就是被分成了几个互相独立的块.像畅通工程这题,问还需要修

HDU 3081:Marriage Match II(二分图匹配+并查集)

http://acm.hdu.edu.cn/showproblem.php?pid=3081 题意:有n个男生n个女生,他们只有没有争吵或者女生a与男生A没有争吵,且女生b与女生a是朋友,因此女生b也可以和男生A过家家(具有传递性).给出m个关系,代表女生a和男生b没有争吵过.给出k个关系,代表女生a与女生b是好朋友.每一轮过家家之后,女生只能选择可以选择并且没选过的男生过家家,问游戏能进行几轮. 思路:因为n<=100,因此支持O(n^3)的算法,挺容易想到是一个二分图匹配的.(出现在我的网络