题目:
给定一个包含N个点,M条边的无向图,每条边的边权均为1。
再给定K个三元组(A,B,C),表示从A点走到B点后不能往C点走(即路径中不能出现连续三个点为ABC)。注意三元组是有序的,如可以从B点走到A点再走到C点。
现在你要在K个三元组的限制下,找出1号点到N号点的最短路径,并输出任意一条合法路径,会有Check检查你的输出。
分析:
bfs+标记,判定好K个三元组的情况即可。
附上代码:
const
maxn=2000;
var
data:array[0..maxn,1..2] of longint;
map,temp:array[0..maxn,0..maxn] of longint;
father:array[0..maxn] of longint;
n,m,k,num:longint;
procedure work(x,y:longint);
begin
inc(map[x,0]);
map[x,map[x,0]]:=y;
end;
procedure init;
var
x,y,i:longint;
begin
readln(n,m,k);
for i:=1 to m do
begin
readln(x,y);
work(x,y);
work(y,x);
end;
for i:=1 to k do
begin
readln(x,y,num);
temp[x,y]:=num;
end;
if n=1 then
begin
writeln(0);
writeln(1);
halt;
end;
end;
procedure print(tail:longint);
begin
writeln(data[tail,2]);
halt;
end;
procedure bfs;
var
head,tail,i:longint;
begin
head:=1;tail:=1;
data[head,1]:=1;data[head,2]:=0;father[head]:=0;
while head<=tail do
begin
num:=data[head,1];
for i:=1 to map[num,0] do
if temp[data[father[head],1],num]<>map[num,i] then
begin
inc(tail);
father[tail]:=head;
data[tail,1]:=map[num,i];
data[tail,2]:=data[head,2]+1;
if data[tail,1]=n then
print(tail);
end;
inc(head);
end;
end;
begin
init;
bfs;
end.