查錯(拓撲排序 堆維護)

2021-07-24 12:28:05 字數 2857 閱讀 6876

不了解堆的可以開啟鏈結看看基礎**:

拓撲排序 :

由aov網構造拓撲序列的拓撲排序演算法主要是迴圈執行以下兩步,直到不存在入度為0的頂點為止。

(1) 選擇乙個入度為0的頂點並輸出之;

(2) 從網中刪除此頂點及所有出邊。

查錯 [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 df;

type point=^node;

node=record

date,ends:longint;

next:point;

end;

var i,j,n,m,x,y,z,k,t,len:longint;

p:point;

path:array[0..100000] of point;

a,c,d,e,f:array[0..100000] of longint;

tm:array[0..1000000] of longint;

b,zhan,re:array[0..100000] of boolean;

procedure com(x,y:longint);

var i:point;

begin

i:=path[x];

new(path[x]);

path[x]^.ends:=y;

path[x]^.next:=i;

end;

procedure put(x:longint); //維護度數為零的點中的最小值

var i,j:longint;

begin

inc(len);

a[len]:=x;

i:=len;

while (a[i div 2]>a[i]) and (i>1) do

begin

j:=a[i]; a[i]:=a[i div 2]; a[i div 2]:=j;

i:=i div 2;

end;

end;

function get:longint;

var i,j,d:longint;

begin

get:=a[1];

a[1]:=a[len];

dec(len);

i:=1;

while i*2<=len do

begin

if a[i*2]>a[i*2+1] then j:=i*2+1

else j:=i*2;

if a[i]>a[j] then

begin

d:=a[j]; a[j]:=a[i]; a[i]:=d;

end;

i:=j;

end;

end;

procedure dfs;

var i:point;

x,y:longint;

begin

while len>0 do

begin

x:=get;

inc(t);

c[t]:=x; //作為最小值取出

i:=path[x];

while (i<>nil) do //將相連的邊刪去,繼續找度數為零的

begin

y:=i^.ends;

dec(d[y]);

if d[y]=0 then put(y);

i^.ends:=0;

i:=i^.next;

end;

end;

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;

len:=0; t:=0;

for i:=1 to n do

if d[i]=0 then put(i);

dfs;

if t=n then

for i:=1 to t do

write(c[i],』 『);

if t<>n then writeln(『omg.』); //說明有環

close(input);

close(output);

end.

查錯 (拓撲排序 堆維護)

查錯 description 一天,考試題神坑了。不過,我們的mosaic還是成功的寫出了程式,當然,結果比較贊 tbmw tbmw 結果被痛罵了一頓。經過漫長的檢查,mosaic發現他的程式有m處錯誤,現在要做的就是修改程式了。但是他發現,這m處錯誤存在複雜的聯絡,有的錯誤必須在其他錯誤之前改正,...

拓撲排序用堆維護

堆是一種效率很高的資料結構,可以動態地維護乙個數列的最大或最小值,用堆維護拓撲排序效率比佇列高。給定乙個有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...