不了解堆的可以開啟鏈結看看基礎**:
拓撲排序 :
由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...