刷題 環套樹 旅行

2022-08-13 21:45:18 字數 1254 閱讀 7916

noip2018

小 y 的旅行方案是這樣的:

任意選定乙個城市作為起點,然後從起點開始,

每次可以選擇一條與當前城市相連的道路,走向乙個沒有去過的城市,或者沿著第一次訪問該 城市時經過的道路後退到上乙個城市。

當小 y 回到起點時,她可以選擇結束這次旅行或 繼續旅行。

需要注意的是,小 y 要求在旅行方案中,每個城市都被訪問到。

為了讓自己的旅行更有意義,小 y 決定在每到達乙個新的城市(包括起點)時,將 它的編號記錄下來。她知道這樣會形成乙個長度為 nn 的序列。

她希望這個序列的字典序 最小

對於 100% 的資料和所有樣例, 1≤n≤5000

且 m = n − 1 或 m = n。

題解:因為只能回到上乙個,所以當形狀為樹的時候,易知只能走dfs序

當形狀為樹上套乙個環的時候,走法多樣,無法簡單便利,

所以我們考慮刪除一條環上的邊,用topo

很多預處理,很多細節,具體看**

#include#include

#include

#include

using

namespace

std;

intn,m;

const

int n=5003

;int

head[n],tot;

struct

node

e[n<<1

];void add(int u,int

v)int

in[n];

int son[n<<1

],cnt,st[n],ed[n];

void

topo()

}

}bool

broken[n][n],change,fail;

intans[n],pos;

void dfs(int rt,int

f)

for(int i=st[rt];i<=ed[rt];i++)

if(son[i]!=f && !broken[rt][son[i]] )

dfs(son[i],rt);

}void

print()

intmain()

if(mpos=0,dfs(1,0

),print();

else

print();

}return0;

}

n^2的複雜度

NOIP2018 旅行 基環樹

小 y 是乙個愛好旅行的 oier。她來到 x 國,打算將各個城市都玩一遍。小y了解到,x國的 n nn 個城市之間有 m mm 條雙向道路。每條雙向道路連線兩個城市。不存在兩條連線同一對城市的道路,也不存在一條連線乙個城市和它本身的道路。並且,從任意乙個城市出發,通過這些道路都可以到達任意乙個其他...

P5022 旅行 基環樹

以後必須學會面向資料程式設計!看半天題目不知道咋寫直接爆搜,結果分少的可憐,還不如直接貪搞個60分。觀察資料,發現圖至多存在乙個環。顯然,如果沒有環,這個題不跟你多bb,直接貪就完事了,線性複雜度。原因十分顯然,一旦你還沒走到底就往回走的話,就走不完整張圖了。有環的話,這題就是個基環樹。根據題意,小...

基環樹 NOIP2018 旅行

小 y 是乙個愛好旅行的 oier。她來到 x 國,打算將各個城市都玩一遍。小y了解到,x國的 n 個城市之間有 m 條雙向道路。每條雙向道路連線兩個城市。不存在兩條連線同一對城市的道路,也不存在一條連線乙個城市和它本身的道路。並且,從任意乙個城市出發,通過這些道路都可以到達任意乙個其他城市。小 y...