1. 程式人生 > >洛谷P2661 資訊傳遞(帶權並查集求有向圖最小環)

洛谷P2661 資訊傳遞(帶權並查集求有向圖最小環)

題目描述

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

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

輸入輸出格式

輸入格式:

輸入共2行。

第1行包含1個正整數n表示n個人。

第2行包含n個用空格隔開的正整數T1,T2,……,Tn其中第i個整數Ti示編號為i

的同學的資訊傳遞物件是編號為Ti的同學,Ti≤n且Ti≠i

資料保證遊戲一定會結束。

輸出格式:

輸出共 1 行,包含 1 個整數,表示遊戲一共可以進行多少輪。

輸入輸出樣例

輸入樣例#1: 複製
5
2 4 2 3 1
輸出樣例#1: 複製
3

說明

樣例1解釋

遊戲的流程如圖所示。當進行完第 3 輪遊戲後, 4 號玩家會聽到 2 號玩家告訴他自

己的生日,所以答案為 3。當然,第 3 輪遊戲後, 2 號玩家、 3 號玩家都能從自己的訊息

來源得知自己的生日,同樣符合遊戲結束的條件。

對於 30%的資料, n ≤ 200;

對於 60%的資料, n ≤ 2500;

對於 100%的資料, n ≤ 200000。

用帶權並查集求最小環,每次建邊u-->v,長度為1,然後一直合併,當u和v在同一集合,此時成環,環的大小等於v到根節點的長度+1(因為r[x]求的是x到其父節點的權值,我的程式碼裡預設使父節點為v,f[tx]=ty),然後重新整理最小值即可

比如這個例子

加入第一條邊,x1的祖先節點變為x2且x1到x2的距離為1,即f[x1]=x2,r[x1]=1

加入第二條邊,x2的祖先節點變為x3且x2到x3的距離為2,即f[x2]=x3,r[x2]=1

加入第三條邊,x3的祖先節點和x1的祖先節點相同,此時成環,然後經過路徑壓縮f[x1]=x3,r[x1]=2

此時x1到他的祖先節點x3的權值為2,在加上第三條邊,即2+1=3,環長度為3

#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define wtf printf("wtf\n");
using namespace std;
typedef long long ll;
const int N=2e5+20;
int a[N],f[N],r[N],ans=0x3f3f3f3f;
int getf(int x)
{
    if(f[x]==x)return x;
    int t=getf(f[x]);
    r[x]+=r[f[x]];
    f[x]=t;
    return f[x];
}
void mix(int x,int y)
{
    int tx=getf(x);
    int ty=getf(y);
    if(tx!=ty)
    {
        f[tx]=ty;
        r[tx]=r[y]-r[x]+1;
    }
    else
    {
        ans=min(ans,r[y]+1);
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        f[i]=i;
        scanf("%d",&a[i]);
    }
    for(int i=1;i<=n;i++)
        mix(i,a[i]);

    printf("%d\n",ans);
}


相關推薦

P2661 資訊傳遞()

題目描述有n個同學(編號為1到n)正在玩一個資訊傳遞的遊戲。在遊戲裡每人都有一個固定的資訊傳遞物件,其中,編號為i的同學的資訊傳遞物件是編號為Ti同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件(注意:可能有人

/* 把每個同學看成一個點,資訊的傳遞就是在他們之間連有向邊,遊戲輪數就是求最小環。 圖論求最小環,我在裡面看到了並查集。 假如說資訊由A傳遞給B,那麼就連一條由A指向B的邊,同時更新A的父節點,A到它的父節點的路徑長也就是B到它的父節點的路徑長+1。 這樣我們就建立

12.3日+佛依德處理無+dijkstra處理

  昨天的資料庫考試,題目本身都簡單的,但是感覺時間有點緊張,可能和自己有點墨跡有關。題目不怕不會做,就怕讀錯題,上了大學養成了考試“做完一遍要檢查的壞習慣”,這次沒時間檢查,所以有種做的不好的感覺。       弗洛伊德演算法是運用的動態規劃的思

藍橋杯歷屆試題 危險係數(dfs或者關於兩點的割點個數)

Description 抗日戰爭時期,冀中平原的地道戰曾發揮重要作用。 地道的多個站點間有通道連線,形成了龐大的網路。但也有隱患,當敵人發現了某個站點後,其它站點間可能因此會失去聯絡。 我們來定義一個危險係數DF(x,y): 對於兩個站點x和y (x != y), 如果能找到一個站點z,當

P2661 資訊傳遞

題目描述 有 nnn 個同學(編號為 111 到 nnn )正在玩一個資訊傳遞的遊戲。在遊戲裡每人都有一個固定的資訊傳遞物件,其中,編號為 iii 的同學的資訊傳遞物件是編號為 TiT_iTi​ 的同學。 遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知

p2661資訊傳遞

題目: 有 n 個同學(編號為 1到 n )正在玩一個資訊傳遞的遊戲。在遊戲裡每人都有一個固定的資訊傳遞物件,其中,編號為 i 的同學的資訊傳遞物件是編號為 Ti​ 的同學。 遊戲開始時,每人都只知道自己的生日。之後每一輪中,

P2661 資訊傳遞 【tarjan

題目描述: 有 n 個同學(編號為1到n) 正在玩一個資訊傳遞的遊戲。在遊戲裡每人都有一個固定的資訊傳遞物件,其中,編號為 i 的同學的資訊傳遞物件是編號為 Ti的同學。 遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳

P1196】

傳送門:https://www.luogu.org/problemnew/show/P1196#sub 大家都說並查集按秩合併並沒有用,所以我以後大概也不會寫按秩合併了。 而且帶權並查集,不能寫按秩合併好像! 普通的並查集只能維護在不在同一個集合,合併到同一個集合,但是帶權並查集就可以維

P2661 資訊傳遞 topo排序+dfs

傳送門 這一題可以算是有向圖求最小環的模板題了 比如這個圖,第一輪遊戲2的生日傳到4,第二輪遊戲2的生日傳到3,第三輪遊戲2的生日傳到2自己 遊戲能進行的輪數就是圖中的最小環 先進行一次拓撲排序使圖中只剩下環,然後dfs求最小環的長度就行了 #include<iostream>

Bzoj1202/P2294 [HNOI2005]狡猾的商人(/差分約束系統)

pen ems http type 判斷 put .com 就是 algo 題面 Bzoj 洛谷 題解 考慮帶權並查集,設\(f[i]\)表示\(i\)的父親(\(\forall f[i]<i\)),\(sum[i]\)表示\(\sum\limits_{j=fa[i]

poj 1182 ()

ios int 查找 食物 spa script ble 距離 輸出 食物鏈 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 71361 Accepted: 21131 Des

HDU3635 Dragon Balls(

align size any cat webkit city ret follow num 題目鏈接:   http://acm.hdu.edu.cn/showproblem.php?pid=3635 題目描述: Dragon Balls Problem Descript

HDU 3635 Dragon Balls()

clas pos 水題 ont span popu post join -- 題目地址:pid=3635">HDU 3635 加權並查集水題。 用num數組維護該城市有多少龍珠,用times數組維護每一個龍珠運輸了多少次。num數組在合並的時候維護。times數

】HDU 3047 Zjnu Stadium

void mem ios ack string blank iostream style csdn http://acm.hdu.edu.cn/showproblem.php?pid=3047 【題意】 http://blog.csdn.net/hj1107402232/a

——poj2236(

algorithm blog oid poj2236 stream 命令 net 最大 spa 題目:Wireless Network 題意:給定n臺已損壞計算機的位置和計算機最遠通信距離d,然後分別根據命令執行以下兩種操作: "O p" (1 <= p <=

HDU - 3038 / 3048 () (待補)

hdu return bsp value 題目 ios i++ mes sca 題目鏈接:點我點我 題意: 題解: 兩題代碼差不多,放個3047的。 1 #include <cstdio> 2 #include <iostream>

D - How Many Answers Are Wrong HDU - 3038

following follow tar ndt wrong get gin k60 man w2csi眾美8uk唾嚎http://www.facebolw.com/space/2103369/following Y47炮K兌B巧約鐐39http://www.facebo

【BZOJ 3376】[Usaco2004 Open]Cube Stacking 方塊遊戲

inline 記錄 cst cnblogs bsp tac bzoj 開始 scan 這道題一開始以為是平衡樹結果發現復雜度過不去,然後發現我們一直合並而且只是記錄到最低的距離,那麽就是帶權並查集了,帶權並查集的權一般是到根的距離,因為不算根要好打,不過還有一些其他的,具體

HDU 3038 How Many Answers Are Wrong(

define pro tor memset set sizeof fin printf class 題目鏈接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1272 題目大意:有n條信息,每條信息都給出區間l到r的值,如果

POJ 1182 食物鏈 (

動物 return i++ rip width d+ oid body 思維 食物鏈 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 78551 Accepte