拓撲排序 煩人的幻燈片 病毒

2021-08-07 14:41:06 字數 3967 閱讀 1134

q:拓撲排序用於解決什麼問題?

煩人的幻燈片

題目描述

李教授於今天下午做乙個非常重要的演講。不幸的是他不是乙個非常愛整潔的人,他把自己做演講要用的幻燈片隨便堆放在一起。因此,演講之前他不得不去整理這些幻燈片。做為乙個講求效率的學者,他希望盡可能簡單地完成它。情況是這樣,教授這次演講一共要用n張幻燈片(n<=26),這n張幻燈片按照演講要使用的順序已經用數字1,2,…,n在上面編上了號。因為幻燈片是透明的,所以我們不能一下子看清每乙個數字所對應的幻燈片。

現在我們用大寫字母a,b,c,。。。再次把幻燈片依次編號。你的任務是編寫乙個程式,把幻燈片的數字編號和字母編號對應起來,顯然這種對應應該是唯一的;若出現多種對應的情況或是某些數字編號和字母對應不起來,我們就稱對應是無法實現的。

輸入 第一行:只有乙個數n,表示有n張幻燈片。

接下來的n行:包括4個整數xmin,xmax,ymin,ymax(整數之間用空格分開),為幻燈片的座標(該區域為幻燈片),這n張幻燈片按其在輸入檔案中出現的順序從前到後依次編號為a,b,c,…再接下來的n行依次為n個數字編號的座標x,y,顯然在幻燈片之外是不會有數字的。

輸出 若是對應可以實現,你的輸出應該包括n行,每一行為乙個字母和乙個數字,中間以乙個空格隔開,並且各行以字母的公升序排列,注意輸出的字母要大寫並且頂格;反之,若是對應無法實現,在第一行頂格輸出none即可。行首行末無多餘空格。

樣例輸入

4 6 22 10 20

4 18 6 16

8 20 2 18

10 24 4 8

9 15

19 17

11 7

21 11

樣例輸出

a 4

b 1

c 2

d 3這個幻燈片夠煩人的。

本題的關鍵在於如何構圖,構造拓撲排序的模型。

題目大意為若干部分(或全部)重合二維的矩形中分布有若干個點,乙個矩形和乙個點如小王子和狐狸一樣彼此唯一擁有,讓你進行分配,無法分配輸出「none」。

建模:統計每張幻燈片中有幾個點(或每個點在幾張幻燈片中),每次確定只擁有乙個點的幻燈片。可以想到用拓撲排序。

**如下:

#include

using

namespace

std;

bool f=true;

int n,num,top,matrix[30][30],ru[30],chu[30],zhan[30],ans[30];

struct photo;

photo photo[30];

struct node;

node node[30];

void print()

int main()

for (int i=1; i<=n; i++) ru[i]=chu[i]-1;//入度為出度-1

while (num!=n)

//break 一點小優化:入度為0的點出度為1

ru[i]=0x7fffffff; //相當於開乙個bool陣列,每個點只入棧一次 }}

if (ss==0)

for (int i=1; i<=ss; i++)//去掉相連的邊 }}

if (f) print();

else

printf("none");

return0;}

/*4

6 22 10 20

4 18 6 16

8 20 2 18

10 24 4 8

9 15

19 17

11 7

21 11

*/

病毒

題目描述

有一天,小y突然發現自己的計算機感染了一種病毒!還好,小y發現這種病毒很弱,只是會把文件中的所有字母替換成其他字母,但並不改變順序,也不會增加和刪除字母。

現在怎麼恢復原來的文件呢?小y很聰明,他在其他沒有感染病毒的機器上,生成了乙個由若干單詞構成的字典,字典中的單詞是按照字母順序排列的,他把這個檔案拷貝到自己的機器裡,故意讓它感染上病毒,他想利用這個字典檔案原來的有序性,找到病毒替換字母的規律,再用來恢復其他文件。

現在你的任務是:告訴你被病毒感染了的字典,要你恢復乙個字母串。

輸入 第1行為整數k(<50000),表示字典中的單詞個數。

以下k行,是被病毒感染了的字典,每行乙個單詞。

最後一行是需要你恢復的一串字母。

所有字母均為小寫。

輸出 輸出僅一行:為恢復後的一串字母,當然也有可能出現字典不完整、甚至字典是錯的情況,這時請輸出乙個0。

樣例輸入

6 cebdbac

cac

ecd

dca

aba

bac

cedab

樣例輸出

abcde

好吧我承認我這道題死於題意。「字典中的單詞是按照字母順序排列的」這句話智障的我理解成了單詞中的每乙個單詞的字母是按照「abcde….」的順序出現的,然而想想英語課本words and expressions in each unit 中各個單詞按首字母排序,首字母相同的按照第二個字母排,以此類推。。

明白這個原理,就很容易構建出拓撲排序的模型了:將相鄰的兩個單詞從首字母開始往後找,遇到不同的字母就建立邊,然後馬上break;對圖進行topsort,得到的拓撲序列就是「密碼」:每個字母在ans中的位置即為正確的字母。

但是還需要注意乙個問題——有哪幾點需要輸出「0」:

(1)在構圖的時候,不相同的兩組單詞不能有重複,否則就違背了「這個字典檔案原來的有序性」原則,所以建乙個matrix進行標記;

(2)aov網中最關鍵的一點是不能有環,否則不能形成拓撲序列;

(3)待更正的單詞中有字母在「字典」中查不到。

(4)在拓撲排序的過程中,每一輪只能有且只有乙個入度為0的點,即拓撲序列是唯一的

#include

#include

#include

#include

#include

#include

using

namespace

std;

string st[50001];

char ch[101];

bool matrix[30][30];

int n,num_edge,top,num,tot,maxchar,ru[50001],zhan[50001],head[30],ans[30],t;//ans用來存拓撲序列

struct edge;

edge edge[300];

void add_edge(int from,int to)

void topsort()

if (ss!=1) //有環

while (top!=0)

}}int main()

for (int i=1; i<=n-1; i++)

add_edge(st[i][k]-96,st[j][k]-96);

ru[st[j][k]-96]++;

matrix[st[i][k]-96][st[j][k]-96]=1;

break;//不要忘記break,每次只取乙個字母 }}

}topsort();

getchar();//讀掉回車

gets(ch);

int len=strlen(ch);

for (int i=0; i<=len; i++)//i從0開始

if (ch[i]-96>maxchar)

for (int i=0; i<=len-1; i++)

for (int j=1; j<=tot; j++)

if (ch[i]-96==ans[j])

printf("%c",j+96);

return0;}

/*6cebdbac

cacecd

dcaaba

baccedab

*/

codevs 4735 煩人的幻燈片

題目描述 description 帥氣的作者將於今天下午作一次非常重要的演講。不幸的是他不是乙個非常愛整潔的人,他把自己演講要用的幻燈片隨便堆在了一起。因此,演講之前他不得不去整理這些幻燈片。作為乙個講求效率的oier,他希望盡可能簡單地完成它。帥氣的作者這次演講一共要用n張幻燈片 n 26 這n張...

最近演講的幻燈片

如您所知,與在場 演講相比,單獨的幻燈片顯得蒼白,但我仍然覺得值得分享。我剛剛在speakerdeck上發布了我的最後三個準備好的演講。rss閱讀器,您必須訪問該站點才能看到這些內容,因為speakerdeck嵌入是指令碼。我計畫在未來幾年內保持最新狀態,並隨著我自己的工作流程的變化而調整以適應新的...

學習幻燈片效果的筆記

啟發 css樣式的規範寫法 active webkit 模板化操作template css3樣式 webkit transition webkit transition all 1s 8s 設定元素opacity,right樣式的過度動畫 webkit box reflect ie不支援以上樣式 j...