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...