题目描述
经过六年的努力,小明终于被一所知名中学录取。优秀的小明总是对一些奇奇怪怪的事情感兴趣,这次他想知道谁在这所新学校拥有的朋友最多,由于大家都才刚报到,所以小明只知道大家两两之间是否是朋友关系。
输入
输入文件friend.in的第一行有两个整数n和m,n表示总人数,m表示总关系数。
接下来n行,每行有2个以空格隔开的整数a和b,表示a和b是朋友,a和b均为1到n之间的整数。不会给出重复的朋友关系。
输出
输出文件friend.out中仅有一行,表示朋友数最多的人所拥有的朋友,每两个整数之间用空格隔开,按照字典序从小到大输出。如果存在多个人朋友数都是最多的情况,请输出字典序最小的那人的答案,具体见样例。
样例输入
3 3
1 2
2 3
1 3
样例输出
2 3
数据范围限制
50%的数据,1 <= n <= 10
80%的数据,1 <= n <= 1000
100%的数据,1 <= n <= 10000,m <= 500000
提示
1、2、3均拥有2个朋友,因此输出字典序较小的1的朋友即可。
1的朋友为2和3,按照字典序从小到大输出,数字之间用空格隔开。
TJ
直接暴力……
BC
var
n,m,i,x,y:longint;
p:array[1..10000,1..10000]of boolean;
nl:array[1..10000,1..2]of int64;
procedure kp(l,r:longint);
var
i,j,mid,mid1:longint;
t:array[1..2]of int64;
begin
i:=l;
j:=r;
mid:=nl[(l+r)div 2,2];
mid1:=nl[(l+r)div 2,1];
repeat
while (nl[i,2]>mid)or(nl[i,2]=mid)and(nl[i,1]<mid1) do inc(i);
while (nl[j,2]<mid)or(nl[j,2]=mid)and(nl[j,1]>mid1) do dec(j);
if i<=j then
begin
t:=nl[i];
nl[i]:=nl[j];
nl[j]:=t;
inc(i);
dec(j);
end;
until i>j;
if l<j then kp(l,j);
if i<r then kp(i,r);
end;
begin
assign(input,'friend.in');reset(input);
assign(output,'friend.out');rewrite(output);
readln(n,m);
for i:=1 to m do
begin
readln(x,y);
p[x,y]:=true;
p[y,x]:=true;
inc(nl[x,2]);
inc(nl[y,2]);
end;
for i:=1 to n do nl[i,1]:=i;
kp(1,n);
for i:=1 to n do if p[nl[1,1],i] then write(i,' ');
writeln;
close(input);close(output);
end.