noip2015 d1t2 資訊傳遞

2022-05-20 04:23:48 字數 847 閱讀 2835

題目鏈結

題意:給定乙個圖,每個節點的出度為1,求最小環的結點數

參考:可以先把不在環內的點清除掉,再對於每個環跑一遍長度

1 #include2 #include3 #include4

using

namespace

std;

5#define maxn 200010

6int

in_degree[maxn],reach[maxn];

7bool

vis[maxn];

8int

n,ans;

9int

read()

16while (ch>='

0'&&ch<='9'

)20return x*f;21}

22void clean(int i)

27void dfs(int p,int len)

32int

main()

41for (int i=1;i<=n;i++)

42if (!in_degree[i]&&!vis[i]) clean(i);//

注意兩個限制條件,防止重複的刪除

43 ans=n+1;44

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

45if (!vis[i]) dfs(i,1

);46 ans=ans>n?0

:ans;

47 printf("

%d\n

",ans);

48return0;

49 }

view code

另外常規的解法是用tarjan求強連通分量 留坑

NOIP 2015 D1 T2 資訊傳遞

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

NOIP2015 D1T2 資訊傳遞

一道有很多種解法的題目 通過劃歸,發現就是求最小環 那麼立即能想到的演算法 1 tarjan求強連通分量,最無腦 2 對於每個連通分量用topo sort,相當於剪去其他不在環上的邊 不過用帶權並查集也可以解決這道題目 首先發現只要一條邊連線的兩個點a b在之前已經在乙個集合中,則必定會形成乙個環 ...

noip2015day1t2 資訊傳遞

把每個同學看成乙個點,傳遞關係看成一條邊,點數等於邊數,因此圖由若干個環或環鏈復合邊數等於點數的東西組成,不存在孤立鏈。在圖上,傳遞一輪後,每個點掌握沿邊前乙個點的資訊,傳遞x輪後,任意乙個點恰好掌握沿邊反向前進x條邊的路徑上的所有點的資訊,要聽到自己的資訊,也就是在環上走一圈。這樣就把題目抽象為找...