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提高組模擬2(T1,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>