基環樹 NOIP2018 旅行

2022-09-03 01:51:10 字數 1854 閱讀 2311

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

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

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

為了讓自己的旅行更有意義,小 y 決定在每到達乙個新的城市(包括起點)時,將 它的編號記錄下來。她知道這樣會形成乙個長度為\(n\)的序列。她希望這個序列的字典序 最小,你能幫幫她嗎? 對於兩個長度均為\(n\)的序列\(a\)和\(b\),當且僅當存在乙個正整數\(x\),滿足以下條件時, 我們說序列\(a\)的字典序小於\(b\)。

輸入格式:

輸入檔案共\(m+1\) 行。第一行包含兩個整數\(n,m(m≤n)\),中間用乙個空格分隔。

接下來\(m\)行,每行包含兩個整數\(u,v(1≤u,v≤n)\),表示編號為\(u\)和\(v\)的城市之 間有一條道路,兩個整數之間用乙個空格分隔。

輸出格式:

輸出檔案包含一行,\(n\)個整數,表示字典序最小的序列。相鄰兩個整數之間用乙個空格分隔。

6 5

1 32 3

2 53 4

4 6

1 3 2 5 4 6

6 6

1 32 3

2 53 4

4 54 6

1 3 2 4 5 6

[資料規模與約定]

對於\(100\%\)的資料和所有樣例,\(1\le n\le 5000\)且 \(m=n−1\) 或\(m=n\)。

先考慮\(m=n-1\)的情況:

因為保證圖聯通,所以這張圖一定是一棵樹

為保證字典序最小,我們的遍歷要從\(1\)號節點開始

然後就每次遍歷編號最小的節點就可以得到最小的字典序

再來考慮\(m=n\)的情況:

列舉圖中每一條邊,然後刪掉,按\(m=n-1\)的情況跑遍歷就行了,時間複雜度\(o(n^2)\)

注意如果刪去的不是環上的邊要判斷下乙個節點有沒有遍歷過

上**:

#includeusing namespace std;

const int maxn=5001;

struct edge

}e[maxn*2];

vectorv[maxn];

int n,m,x,y,l,r,num_of_edge,ans[maxn],ans_[maxn],head[maxn];

bool vis[maxn];

void add_edge_(int x,int y)

void add_edge(int x,int y)

void dfs_to_get_ans(int now,int lst)

void change_the_ans()

int main()

for(int i=1;i<=n;i++)sort(v[i].begin(),v[i].end());

if(n!=m)else

}for(int i=1;i<=n;i++)printf("%d ",ans[i]);

}}

NOIP2018 旅行 基環樹

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

NOIp 2018 旅行 題解

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

比賽 NOIP2018 旅行

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