查錯
考場上又寫掛的一道簽到題。。。
我們發現這題要求得到乙個最小字典序列
顯然找到所有序列然後排序是不可取的,
那麼我們不能使用平常的拓撲排序方法,怎麼搞使得在每次處理拓撲順序的時候來維護呢?
用小根堆維護入度為0的點即可,輸入的時候統計入度
const maxn=100010view code;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.
滿足特定順序的字典序列中最小子序列
輸入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...