洛谷P5049 洛谷P5022 題解 旅行

2022-05-16 11:10:16 字數 1358 閱讀 5023

原題

資料加強版

加強版**參考你谷題解

終於調過了(又是一如既往的申必錯誤)

€€£ noi plus石錘了

原題的資料允許我們\(o(n^2)\)暴力斷邊,但是加強版的資料達到了\(n\log n\)級別,我們必須在斷邊這一環節尋求更好的解法。

考慮我們進入環後在何處回溯(根據繼續走環走到的點分類):

(設當前已經從\(b\)走到\(c\))

1.編號最小(\(d):顯然可以直接繼續走;

2.編號非最大/最小(\(e):按大小順序走完支鏈再來;

3.編號最大(\(d>e,f\)):需要分兩種情況討論,

①出邊就是最大的(\(d>b\)),此時回溯更優;

②回溯後的比出邊大(\(b>d\)),只能硬著頭皮走下去。

所以說在走的時候需要記錄一下最大點,這時候把邊按照終點排序會很有幫助。

1.只能回溯一次,注意標記(**中back);

2.注意一些功能的實現(如找環、排邊等等)。

(附注釋)

(預設源在置頂部落格)

#define n 500010

int n,m,ans[n],tot,back,mx,isring;

int vis[n],rin[n],fa[n];

struct input

}ipt[n<<1];

bool operator < (input a,input b)

struct edge e[n<<1];

int head[n],cnt;

inline void ade(int u,int v)

void dfs1(int now)

}void dfs_ring(int now,int ff)

rin[now]=isring=1;

return;

} for(rg int i=head[now];i;i=e[i].nxt)

}void dfs2(int now)

}} for(rg int i=head[now];i;i=e[i].nxt)

} }else }}

int main()

sort(ipt+1,ipt+1+2*m);

for(rg int i=1;i<=2*m;i++)ade(ipt[i].frm,ipt[i].to);//排序後加邊

if(m==n-1){

dfs1(1);

for(rg int i=1;i<=n;i++)cout繼續咕咕咕

洛谷 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 旅行(DFS 斷環)

首先對於m n 1的情況非常好想 即這是一棵樹,然後從1節點開始,搜一遍。注意要搜出來的序列的字典序最小,所以用鄰接矩陣來儲存,存的時候按當前節點能到的節點的編號從小到大排序。當m n的時候 這時候便是乙個基環樹,在樹上的某乙個地方會有乙個環,會發現環上的有一條邊是不會走的。然而並不確定這條邊到底是...