拓撲序列的最小字典序列

2022-02-06 08:27:44 字數 2711 閱讀 1413

查錯

考場上又寫掛的一道簽到題。。。

我們發現這題要求得到乙個最小字典序列

顯然找到所有序列然後排序是不可取的,

那麼我們不能使用平常的拓撲排序方法,怎麼搞使得在每次處理拓撲順序的時候來維護呢?

用小根堆維護入度為0的點即可,輸入的時候統計入度

const maxn=100010

;type node=record

pos,next:longint;

end;

var heap,getin,head,ans:array[0..maxn] of

longint;

edge:

array[0..maxn*2] of

node;

n,m,cnt,top:longint;

check:boolean;

procedure

add(u,v:longint); inline;

begin

inc(cnt);

edge[cnt].pos:=v;

edge[cnt].next:=head[u];

head[u]:=cnt;

end;

procedure swap(var

a,b:longint); inline;

begin

a:=a xor b;

b:=a xor b;

a:=a xor b;

end;

procedure

up(i:longint); inline;

varj:longint;

begin

j:=i>>1

;

while j>0

dobegin

if heap[i]then

begin

swap(heap[i],heap[j]);

i:=j;

j:=j>>1

;

endelse

break;

end;

end;

procedure

down(i:longint); inline;

varj:longint;

begin

j:=i<<1

;

while j<=top do

begin

if (jand (heap[j]>heap[j+1]) then

inc(j);

if heap[i]>heap[j] then

begin

swap(heap[i],heap[j]);

i:=j;

j:=j<<1

;

endelse

break;

end;

end;

procedure

init;

vari,x,y:longint;

begin

read(n,m);

for i:=1

to m do

begin

read(x,y);

add(x,y);

inc(getin[y]);

end;

for i:=1

to n do

if getin[i]=0

then

begin

inc(top);

heap[top]:=i;

end;

check:=true;

end;

procedure

main;

vari,j,x,y:longint;

begin

for j:=1

to n do

begin

if (top=0) then

begin

check:=false;

break;

end;

x:=heap[1

]; ans[j]:=x;

swap(heap[

1],heap[top]);

dec(top);

down(1);

i:=head[x];

while i<>0

dobegin

y:=edge[i].pos;

dec(getin[y]);

if getin[y]=0

then

begin

inc(top);

heap[top]:=y;

up(top);

end;

i:=edge[i].next;

end;

end;

end;

procedure

print;

vari:longint;

begin

ifnot check then writeln('

omg.')

else

begin

for i:=1

to n-1

dowrite(ans[i],''

); writeln(ans[n]);

end;

end;

begin

init;

main;

print;

end.

view code

滿足特定順序的字典序列中最小子序列

輸入12345,找出全部的字典序排序 12345,12354,12435,12453 21345 31245 41235 51234 54321 並且在所有字典序中,找出,滿足序列2 1 5排序的最小的子串行 舉例 12345不滿足2 1 5 3 2 4 1 5滿足,2 1 3 4 5也滿足,相比較...

模板 拓撲序列

拓撲序列有很多用途,比如判環,將樹上 圖上的問題轉化為序列上的問題再處理等等 尋找過程就是不斷找入度為0的點新增到q尾部 如果得到的拓撲序列長度不等於n 則說明有環 void toposort int n while q.empty 例題 可達性統計 此題可以用拓撲序 暴力合併解決 原因 題目給出了...

nowcoder 拼接最小字典序

對於乙個給定的字串陣列,請找到一種拼接順序,使所有小字串拼接成的大字串是所有可能的拼接中字典序最小的。給定乙個字串陣列strs,同時給定它的大小,請返回拼接成的串。測試樣例 abc de 2 abcde 定義比較函式st r1 s tr2 st r2 s tr1 然後自定義快排。class prio...