查錯
[description]
一天,考試題神坑了。不過,我們的mosaic還是成功的寫出了程式,當然,結果比較贊:「tbmw*tbmw*」,結果被痛罵了一頓。經過漫長的檢查,mosaic發現他的程式有m處錯誤,現在要做的就是修改程式了。但是他發現,這m處錯誤存在複雜的聯絡,有的錯誤必須在其他錯誤之前改正,否則事情會變得很麻煩,因此,他開始寫另乙個程式來解決這個問題……
[input]
第一行兩個整數:m,n。n表示程式之間的依賴關係數量
以下n行每行兩個整數a,b。表示第a處錯誤必須在第b處錯誤之前改正。
[output]
一行,按改正順序輸出錯誤編號。若有多解,請輸出字典序小的解(即盡量使編號小的錯誤先被改正)。如果無解,輸出「omg.」(不含引號)。
[sample]
sample input
5 5
1 2
2 3
1 3
1 4
4 5
sample output
1 2 3 4 5
[hint]
對於100%的資料,有0 < m,n ≤ 100000
保證沒有重邊。
program mys;
type ab=^node;
node=record
ends:longint;
next:ab;
end;
var i,j,k,m,n,chu,t,x,y:longint;
p:array[0..200000]of ab;
f,a,d:array[0..200000]of longint;
procedure
com(x,y:longint);
var i:ab;
begin
i:=p[x];
new(p[x]);
p[x]^.ends:=y;
p[x]^.next:=i;
end;
procedure
put(x:longint);
var i,j,k,g,h:longint;
begin
inc(t);
f[t]:=x;
j:=t;
i:=j div
2;while (f[i]>f[j]) and (j>1) do
begin
k:=f[j]; f[j]:=f[i]; f[i]:=k;
j:=i;
i:=j div
2;end;
end;
function
get:longint;
var ff,son,p:longint;
begin
get:=f[1];
f[1]:=f[t];
dec(t);
ff:=1;
while ff*2
<=t do
begin
if (ff*2+1>t)or(f[ff*2]2+1]) then
son:=ff*2
else son:=ff*2+1;
if f[ff]>f[son] then
begin
p:=f[ff]; f[ff]:=f[son]; f[son]:=p;
end;
ff:=son;
end;
end;
procedure
fa;var i:ab;
y,x:longint;
begin
if t>0
then
repeat
x:=get;
inc(chu);
a[chu]:=x;
i:=p[x];
while i<>nil
dobegin
y:=i^.ends;
dec(d[y]);
if d[y]=0
then put(y);
i:=i^.next;
end;
p[x]:=nil;
until t<=0;
end;
begin
assign(input,'correct.in'); reset(input);
assign(output,'correct.out'); rewrite(output);
readln(n,m);
for i:=1
to m do
begin
readln(x,y);
com(x,y);
inc(d[y]);
end;
for i:=1
to n do
if d[i]=0
then put(i);
chu:=0;
fa;if chuthen
begin
writeln('omg.');
close(input);
close(output);
end;
for i:=1
to chu-1
dowrite(a[i],' ');
write(a[chu]);
close(input);
close(output);
end.
查錯(拓撲排序 堆維護)
不了解堆的可以開啟鏈結看看基礎 拓撲排序 由aov網構造拓撲序列的拓撲排序演算法主要是迴圈執行以下兩步,直到不存在入度為0的頂點為止。1 選擇乙個入度為0的頂點並輸出之 2 從網中刪除此頂點及所有出邊。查錯 description 一天,考試題神坑了。不過,我們的 mosaic 還是成功的寫出了程式...
拓撲排序用堆維護
堆是一種效率很高的資料結構,可以動態地維護乙個數列的最大或最小值,用堆維護拓撲排序效率比佇列高。給定乙個有n個節點的有向圖 編號為0 n 1 求其拓撲排序的最小字典序。第一行兩個整數 n和m,表示圖有n個點,m條邊。接下來m行,2個整數ui和vi,表示ui到vi有條有向邊。n個用空格隔開的整數,表示...
離散化 拓撲排序 最短路堆優化
資料範圍太大,自身無法作為陣列的下標儲存對應的屬性,當資料至於他們之間的相對大小有關,而與具體值無關時,則可以進行離散化。做法 不改變資料相對大小的前提下,對資料進行縮小 struct node a 100001 從小到大排序 b 100001 for i 1 i n i b a i order i...