POJ1128 拓撲排序 DFS

2021-10-10 06:14:10 字數 1922 閱讀 3426

看到題應該很容易想到利用拓撲排序來判斷相框之間的關係,對於每乙個相框,我們遍歷一遍可以找到他的 上下左右 四條邊的位置,再搜尋這幾條邊上是否有其他字母,有的話就新增乙個類似於a然後就是我個人認為的這道題的難點,怎麼按照字典序輸出所有可能答案,

最開始我想的是利用bfs跑拓撲,確定每個點的層級,再對相同層級的點利用next_permutationh函式進行排列,最後發現可能出現乙個點屬於多個層級的情況,如下圖

此時是無法確定d的層級的

對這道題的正確處理應該是利用dfs來跑拓撲,並記錄深度和答案,

當深度等於相框數量時 輸出答案 否則將當前節點指向的所有點的度減少1,並再次進行拓撲排序,在呼叫結束後還需要回溯,將所有減去的點的度加回去,這樣就可以輸出所有的正確答案

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//#define int long long

using

namespace std;

typedef

long

long ll;

const

int maxn=

2e5+50;

const

int inf=

0x3f3f3f3f

;const

int mod=

1e9+7;

const

int hash=

131;

string s[40]

;vector<

int> v[30]

;int degree[30]

=;int vis[30]

=;int h,w,n;

int cnt[30]

=;void

init()

}char ans[30]

;void

topsort

(int tmp,

int depth)

cnt[tmp]++;

for(

int i=

0;i.size()

;i++

)for

(int i=

0;i<

26;i++)if

(vis[i]

&°ree[i]==0

&&!cnt[i]

)topsort

(i,depth+1)

;for

(int i=

0;i.size()

;i++

) cnt[tmp]--;

}int

main()

}}if(shang!=

100) vis[num]=1

;for

(int i=zuo;i<=you;i++)if

(s[xia]

[i]!=id)

}for

(int i=shang;i<=xia;i++)if

(s[i]

[you]

!=id)}}

for(

int i=

0;i<

26;i++)if

(vis[i]

) n++

; ans[n]

='\0'

;for

(int i=

0;i<

26;i++)}

return0;

}

POJ 1128 DAG拓撲排序

題目鏈結poj1128 給定一張邊框覆蓋圖,求邊框從上到下的關係 如果在a的邊框上出現了字母b,就說明b在a的上方 如果邊框a在邊框b的下方,就新增從a到b的一條有向邊 題目要求從下到上輸出 那麼所求的是所得有向無環圖的拓撲排序 題目還要求按照字典序輸出所有可能的順序,用深度優先搜尋 include...

POJ1270 拓撲排序 DFS

題意 先給你乙個字串,讓你給他們排序 再給你一行,在這一行,每兩個就是第乙個需要在第二個前面 思路 dfs寫多了感覺好有啊,就是排序過程中可能會有多種情況。我們考慮一下怎麼排好乙個位置,這個位置可能有多個東西可以佔,那麼這些東西對於這個位置都是等價的,那麼我們可以採用深搜下 回溯來解決。其實還是蠻簡...

POJ1270 拓撲排序 DFS

題意 先給你乙個字串,讓你給他們排序 再給你一行,在這一行,每兩個就是第乙個需要在第二個前面 思路 dfs寫多了感覺好有啊,就是排序過程中可能會有多種情況。我們考慮一下怎麼排好乙個位置,這個位置可能有多個東西可以佔,那麼這些東西對於這個位置都是等價的,那麼我們可以採用深搜下 回溯來解決。其實還是蠻簡...