洛谷 P2661 資訊傳遞

2022-05-20 23:42:52 字數 1293 閱讀 7280

題目描述:

有n個同學(編號為1到n )正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,

其中,編號為i的同學的資訊傳遞物件是編號為ti​的同學。

遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件(注意:可能有人可以從若干人那裡獲取資訊, 但是每人只會把資訊告訴乙個人,即自己的資訊傳遞物件)。

當有人從別人口中得知自己的生日時,遊戲結束。請問該遊戲一共可以進行幾輪?

思路:可以用並查集求最小迴路。可以比作有向圖,每個點出度都為1,即每個點只有一條邊可以到其他點。

如果有乙個傳遞關係:a -> b, b->c, c->a,說明要傳遞3次才能有人會被告知自己的生日,那麼在並查集可以fa[c] = b ,f[b] = a, f[a] = a,

模擬了資訊完全的的傳遞,而且「當有人從別人口中得知自己的生日時,遊戲結束」,那麼我們要維護乙個最小值,即最少傳遞歸合,滿足題意。

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 

7using

namespace

std;

89 typedef long

long

ll;10

#define inf (1ll << 30) - 1

11#define rep(i,j,k) for(int i = (j); i <= (k); i++)

12#define rep__(i,j,k) for(int i = (j); i < (k); i++)

13#define per(i,j,k) for(int i = (j); i >= (k); i--)

14#define per__(i,j,k) for(int i = (j); i > (k); i--)

1516

const

int n = (int)2e5 + 10;17

intfa[n];

18int

g[n];

19int

n,v;

20int ans =inf;

2122

void

init()

2526

int search(int x, int&cnt)

3233

intmain()

49else52}

53 cout << ans <54getchar();getchar();

55return0;

56 }

洛谷P2661 資訊傳遞

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

洛谷 P2661 資訊傳遞

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

洛谷 P2661 資訊傳遞

有 nn n 個同學 編號為 11 1 到 nn n 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為 ii i 的同學的資訊傳遞物件是編號為 tit iti 的同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳...