NOIP2018 旅行 基環樹

2021-09-02 08:01:20 字數 2314 閱讀 4171

小 y 是乙個愛好旅行的 oier。她來到 x 國,打算將各個城市都玩一遍。

小y了解到, x國的 n

nn 個城市之間有 m

mm 條雙向道路。每條雙向道路連線兩個城市。不存在兩條連線同一對城市的道路,也不存在一條連線乙個城市和它本身的道路。並且, 從任意乙個城市出發,通過這些道路都可以到達任意乙個其他城市。小 y 只能通過這些道路從乙個城市前往另乙個城市。

小 y 的旅行方案是這樣的:任意選定乙個城市作為起點,然後從起點開始,每次可以選擇一條與當前城市相連的道路,走向乙個沒有去過的城市,或者沿著第一次訪問該城市時經過的道路後退到上乙個城市。當小 y 回到起點時,她可以選擇結束這次旅行或繼續旅行。需要注意的是,小 y 要求在旅行方案中,每個城市都被訪問到。

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

nn的序列。她希望這個序列的字典序最小,你能幫幫她嗎? 對於兩個長度均為 n

nn 的序列 a

aa 和 b

bb,當且僅當存在乙個正整數 x

xx,滿足以下條件時, 我們說序列 a

aa 的字典序小於 bbb。

輸入格式

輸入檔案共 m+1

m + 1

m+1 行。第一行包含兩個整數 n,m

(m≤n

)n,m(m ≤ n)

n,m(m≤

n),中間用乙個空格分隔。

接下來 m

mm 行,每行包含兩個整數 u,v

(1≤u

,v≤n

)u,v (1 ≤ u,v ≤ n)

u,v(1≤

u,v≤

n),表示編號為 u

uu 和 v

vv 的城市之間有一條道路,兩個整數之間用乙個空格分隔。

輸出格式

輸出檔案包含一行,n

nn 個整數,表示字典序最小的序列。相鄰兩個整數之間用乙個空格分隔。

資料範圍

對於m =n

−1m=n-1

m=n−

1的資料只需要將邊排個序,跑dfs即可。而對於m=n

m=nm=

n的資料即為基環樹的資料,可以暴力列舉環上的邊,暴力斷環,然後跑dfs,找最小字典序即可。時間複雜度為o(n

2)o(n^2)

o(n2

),對於5000的資料來說足夠了。雖然思路簡單,但找環,斷環還是花了點時間。

#include

#include

#include

#include

using

namespace std;

const

int n=

5005

;const

int inf=

0x7fffffff/2

;vector<

int> g[n]

;vector<

int> temp,ans;

int du[n]

,cst,ced;

int n,m,pt,vis[n]

,nxt[n]

;int f[n]

,st;

void

add(

int x,

int y)

void

dfs(

int x,

int prt)

}void

findcircle

(int x,

int prt)

elseif(

!vis[y])}

}if(x==st) pt=0;

}void

dfs2

(int x,

int prt)

}int

main()

for(

int i=

1;i<=n;i++)if

(m==n-1)

else

while

(st!=rt)

;for

(int i=

0;i1;i++

)printf

("%d "

,ans[i]);

printf

("%d"

,ans[n-1]

);}return0;

}

基環樹 NOIP2018 旅行

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

NOIp 2018 旅行 題解

題目傳送門 題目大意 現在有一棵樹或一張只有乙個環的圖 連通 要求遍歷一遍這個圖,遍歷的順序即為乙個長度為 n nn 的序列,要求字典序最小的序列。假如是一棵樹的話,顯然貪心即可,從 1 11 出發,每次往編號小的走就好了。假如只是多一條邊的話,列舉刪掉那一條邊,然後變成一棵樹來做。因為每次都要往編...

比賽 NOIP2018 旅行

發現 m 只有兩種取值,於是可做了 樹的直接貪心 圖的列舉環上的邊去掉,然後做樹的貪心,搜的時候剪一下枝吧 寫得有點亂 include define ui unsigned int define ll long long define db double define ld long double ...