查錯 (拓撲排序 堆維護)

2021-07-24 12:32:17 字數 2667 閱讀 9815

查錯

[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...