洛谷 P5022 旅行(DFS 斷環)

2022-04-06 17:38:01 字數 1155 閱讀 8303

首先對於m=n-1的情況非常好想:即這是一棵樹,然後從1節點開始,搜一遍。注意要搜出來的序列的字典序最小,所以用鄰接矩陣來儲存,存的時候按當前節點能到的節點的編號從小到大排序。

當m=n的時候:這時候便是乙個基環樹,在樹上的某乙個地方會有乙個環,會發現環上的有一條邊是不會走的。然而並不確定這條邊到底是哪一條,所以進行列舉斷環。但找出環來太麻煩,所以可以直接列舉m條邊中哪一條邊不會走,每次看能否將n個點都走一遍,即cnt是否等於n。如果都能走,則每次更新字典序最小的ans。

關於將一條邊斷掉:不需要考慮複雜,只需要假設斷掉的邊的兩個端點分別為x,y,在dfs時,如果當前的邊的端點恰好是x,y,則直接continue即可。

ac**:

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7const

int n=5010

;8 vectora[n];

9int

cnt,tot,x,y,n,m;

10struct

nodeedge[n<<1

];13

inthead[n],k[n],ans[n],vis[n];

14void add(int u,int

v)20

void

change()

23bool

check()29}

30void work(int u,int

fa)39}40

void dfs(int u,int

fa)50}51

intmain()

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

61if(n==m)

70for(int i=1;i<=n;i++) printf("

%d "

,ans[i]);

71return0;

72}73 work(1,-1

);74

for(int i=1;i<=n;i++) printf("

%d "

,ans[i]);

75return0;

76 }

ac**

洛谷 P5022 旅行

傳送門 給出乙個有n nn個點的圖,一共有m mm雙向邊,求如何走能使得走到的點按先後順序字典序最小 對於前60 60 60 的資料來說,直接暴力dfs dfsdf s即可而其他的點,則根據基環樹的性質,將每條邊列舉刪去,剩下的肯定是棵樹 進而就得到了類似於60 60 60 的資料的情況 inclu...

洛谷 P5022 旅行

day2就藍題起步不是要我命嗎 目測資料 不都是基環樹和樹嘛?基環樹我不會但是這個樹的貪心不是裸的嗎?大手一揮 這部分分我打定了!int outp 5100 len void dfs int x,int fa void main 光榮地水到了60分 對於剩下的分,我們來好好觀察一下題面 n 5000...

洛谷P5022 旅行 題解 去環 搜尋

這道題目一開始看的時候沒有思路,但是看到資料範圍裡面有乙個 m n 1 或 m n 一下子有了思路。當 m n 1 時,這就是一棵樹,以1為根節點進行搜尋,每次優先訪問編號小的點即可。當 m n 時,可知只有乙個環,找到環中對應的所有邊,然後遍歷每一條環中的邊,假設刪除它,然後就變成了一棵樹。時間複...