洛谷P2661 資訊傳遞 拓撲排序求最小環

2021-09-23 18:48:14 字數 1299 閱讀 8229

由題可知,乙個人能經別人知道自己的生日,則他必然在乙個環中,所以顯然題目是讓我們求圖中最小的環。結合本題的特性,每個人的出度都為1

11,那麼每個人必定只在乙個環中。如果有人的入度為0

00則說明他一定不在環中,我們可以用拓撲的思想把他及他所連的邊刪去,然後繼續做拓撲排序刪除入度為0

00的點即可。刪完點之後剩下的就全是環了。這個時候我們對每個環做一次dfs

dfsdf

s即可。dfs

dfsdf

s的過程中將乙個環內所有點標記(因為乙個點只可能在乙個環內,所以乙個環內dfs

dfsdf

s任意乙個點都是一樣的),標記過的點就不用再搜尋了。

#include

using

namespace std;

typedef

long

long ll;

const

int maxn =

200000+5

;int n, to, cnt, sum, ans, in[maxn]

, vis[maxn]

, head[maxn]

;struct nodee[maxn]

;void

addedge

(int u,

int v)

void

toposort()

}}}void

dfs(

int x,

int f)

}int

main()

toposort()

; ans =

0x3f3f3f3f

;for

(int i =

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

cout << ans <<

'\n'

;return0;

}

對於這題,你甚至可以用不壓縮路徑的並查集?

#include

using

namespace std;

typedef

long

long ll;

const

int maxn =

200000+5

;int n, ans, cnt, pre[maxn]

;int

find

(int x)

intmain()

else

} cout << ans <<

'\n'

;return0;

}

洛谷 P2661 資訊傳遞(拓撲排序 最小環)

最大環 用拓撲排序,將能在拓撲佇列中的所有點刪掉,即這些點不能在環中,判環。然後找出在環中的點,進行dfs,搜一遍環看它的sum,取min ac 1 include2 include3 include4 include5 include6 using namespace std 7int n,ans...

洛谷P2661 資訊傳遞

有n個同學 編號為1到n 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為i的同學的資訊傳遞物件是編號為ti同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件 注意 可能有人可以從若干人那裡獲取資訊,但是每...

洛谷 P2661 資訊傳遞

有 n個同學 編號為1到 n 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為 i的同學的資訊傳遞物件是編號為 ti同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件 注意 可能有人可以從若干人那裡獲取資訊...