1. 程式人生 > >NOIP2015提高組 資訊傳遞(圖論)

NOIP2015提高組 資訊傳遞(圖論)

【問題描述】

  有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 個整數,表示遊戲一共可以進行多少輪。

【輸入樣例】

5
2 4 2 3 1

【輸出樣例】

3

【樣例解釋】

  遊戲的流程如圖所示。當進行完第 3 輪遊戲後, 4 號玩家會聽到 2 號玩家告訴他自己的生日,所以答案為 3。當然,第 3 輪遊戲後, 2 號玩家、 3 號玩家都能從自己的訊息來源得知自己的生日,同樣符合遊戲結束的條件。
  

【資料範圍】

對於 30%的資料, n ≤ 200;
對於 60%的資料, n ≤ 2500;
對於 100%的資料, n ≤ 200000。

【來源】

NOIP原題

從每一個人出發,看他的資訊好久能回來,記錄最小值。
詳細程式如下:

#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=200005;
int d[maxn],a[maxn],n,vis[maxn],det[maxn],ans=maxn;
void init()
{
    scanf("%d",&n);
    for
(int i=1;i<=n;i++) scanf("%d",&a[i]); } void dfs(int i,int k) { vis[i]=k; det[i]=1; if(det[a[i]]==0) dfs(a[i],k+1); if(vis[a[i]]!=0&&vis[i]-vis[a[i]]+1!=0) ans=min(ans,vis[i]-vis[a[i]]+1); vis[i]=0;//記得清。 } int main() { init(); memset(d,0,sizeof(d)); memset(det,0,sizeof(det)); for(int i=1;i<=n;i++) if(det[i]==0) { dfs(i,1); } printf("%d",ans); return 0; }

相關推薦

NOIP2015提高 資訊傳遞

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

NOIP2015 提高 資訊傳遞】【NOIP2017提高DAY1T2 時間複雜度】【NOIP2017提高DAY2T1 乳酪】

【NOIP2015 提高組 資訊傳遞】 tarjan * _ * 這道題用tarjan就可以了,判一下有向圖強聯通就好了, 如果強連通的點大於一就和ans取一個min。 【圖可能不聯通,所以要加一個迴圈】 #include<bits/stdc++.h>

鄰接表

個數 一個 des 一定的 -- class 晚自習 節點 ext 鄰接表(圖論) 還是挺狗的卡了我一個晚自習;總的來說就相當於將一條條的邊按鏈表的形式存住;點的個數是一定的所以我們可以建一個link數組記錄每一個節點所指引向的鏈表,即以該點為源頭的路;

向前星

我們首先來看一下什麼是前向星.   前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序, 並記錄下以某個點為起點的所有邊在陣列中的起始位置和儲存長度,那麼前向星就構造好了.   用len[i]來記錄所

51NOD 1212 無向最小生成樹

N個點M條邊的無向連通圖,每條邊有一個權值,求該圖的最小生成樹。 輸入 第1行:2個數N,M中間用空格分隔,N為點的數量,M為邊的數量。(2 <= N <= 1000, 1 <= M <= 50000) 第2 - M + 1

演算法設計與分析第四周練習

Network Delay Time 1. 題目 There are N network nodes, labelled 1 to N. Given times, a list of travel times as directed edges times[i

2018提高模擬9未完

2018提高組模擬9 —————————————————————————————————————————20181004 T1 K進位制 (WOJ4036) 【模擬||數論】 描述 給定一個K(2<=K<=16)進位制數a,判斷a是否能被K-1整除。

2018提高模擬10未完

2018提高組模擬10 ————————————————————————————————————————20181005 T1 階乘 (WOJ4043) 素數線性篩    分解質因數   數學推理 描述 有n個正整數a[i],設它們乘積為p,你可以給p乘上一個正

51NOD 1298 圓與三角形

給出圓的圓心和半徑,以及三角形的三個頂點,問圓同三角形是否相交。相交輸出"Yes",否則輸出"No"。(三角形的面積大於0)。     輸

怎麼證明權重不相同的加權無向的最小生成樹是唯一的

設G是所有邊權均不相同的無向聯通圖。 證明一: 首先,易證圖G中權值最小的邊一定是最小生成樹中的邊。(否則最小生成樹加上權值最小的邊後構成一個環,去掉環中任意一條非此邊則形成了另一個權值更小的生

【打CF,學演算法——三星級】CodeForces 216B Forming Teams

題面: B. Forming Teams time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard o

無權最短路徑BFS廣度優先搜尋演算法

廣度優先搜尋(BFS)演算法類似於樹中的層次搜尋: 從任意點s出發,先遍歷與s相鄰的點,然後再遍歷於相鄰的點相鄰的點。注意有向圖必須是順方向的鄰接點。 為什麼說廣度優先搜尋可以用來求無權最短路徑呢?因為,廣度優先搜尋每次都會先發現距離s為k的所有頂點,然後才會 發現距離s

資訊傳遞tarjan演算法

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

2018NOIP提高模擬2T1,T2

2018NOIP提高組模擬2 ———————————————————————————————20180821 1·開鎖匠(unlock) 描述 經濟危機席捲全球,L國也收到衝擊,大量人員失業。 然而,作為L國的風雲人物,X找到了自己的新工作。從

HDU 多校聯賽-Function

題目連結: http://acm.hdu.edu.cn/showproblem.php?pid=6038 Problem Description You are given a permutation a from 0 to n−1 and a permut

怎麽證明權重不相同的加權無向的最小生成樹是唯一的

少包 size tail ati color post 中一 pos 否則 轉自:https://blog.csdn.net/liangzhaoyang1/article/details/51602926 設G是所有邊權均不相同的無向聯通圖。 證

NOIP2015提高第二題資訊傳遞[]

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

資訊傳遞NOIP2015提高

傳送門 這題顯然是找長度最小的環。 怎麼找? dfs唄 思路非常明晰,但是你也許只能得到80分。 因為我們還需要一點簡單的優化。 我們每次遍歷到某一個點,就把它的物件設定為0(沒有), 這

NOIP2015提高day1 —— 資訊傳遞message

#include <fstream> #include <algorithm> using namespace std; ifstream fin("message.in");

[NOIp2015提高]信息傳遞

cst ans sizeof nbsp string for dfs+記憶化 memset log OJ題號:洛谷2661 思路:求最小環。DFS+記憶化。 1 #include<cstdio> 2 #include<cstring>