题解 P1394 【山上的国度】
蒟蒻来水一发PASCAL题解。
I)题目的意思非常明确:水往低处流。所以当最高点有2个及以上时,直接输出Non。
例如有5个数:1 2 3 4 3,这是就直接输出Non。
II)题目输入连接的边后,仍然无法连通,直接输出Non。(这个可以用并查集来判定)
例如有6个村庄,5条边:1-2 1-3 5-6 2-3 6-4
这时就会有2个集合(1,2,3),(4,5,6),直接输出Non。
III)排除这2种情况,就直接输出最高村庄的编号。
具体看程序:
var n,m,i,x,max,max1,max2,y,x1,y1:longint;
f:array[0..100001] of longint;
function find(x:longint):longint; //寻找根节点
begin
if f[x]=x then exit(x);
f[x]:=find(f[x]);
exit(f[x]);
end;
begin
readln(n,m);
for i:=1 to n do
begin
read(x);
if x>max then //求最大
begin max:=x; max1:=1; max2:=i; end; //保存最大的值,个数,位置
if (x=max)and(i<>max2) then inc(max1); //把相同的最大值个数+1
end;
if max1<>1 then writeln('Non') //最高节点有多个,直接输出
else
begin
for i:=1 to n do f[i]:=i; //默认根节点为自己
for i:=1 to m do
begin
readln(x,y);
x1:=find(x); y1:=find(y); //找祖先
if x1<>y1 then f[x1]:=y1; //连边
end;
for i:=1 to n do
if find(i)<>find(1) then
begin writeln('Non'); halt; end;
//没有同一祖先,即没有联通,直接输出
writeln('Oui, j',chr(ord('''')),'ai trouve la solution.');
//按格式输出,由于PASCAL不能直接输出',所以比较奇怪
writeln(max2); //输出位置
end;
end.