在jsoi2005夏令營快要結束的時候,很多營員提出來要把整個夏令營期間的資料燒錄成一張光碟給大家,以便大家回去後繼續學習。組委會覺得這個主意不錯!可是組委會一時沒有足夠的空光碟,沒法保證每個人都能拿到燒錄上資料的光碟,又來不及去買了,怎麼辦呢?!
組委會把這個難題交給了lhc,lhc分析了一下所有營員的地域關係,發現有些營員是乙個城市的,其實他們只需要一張就可以了,因為乙個人拿到光碟後,其他人可以帶著u盤之類的東西去拷貝啊!
可是,lhc調查後發現,由於種種原因,有些營員並不是那麼的合作,他們願意某一些人到他那兒拷貝資料,當然也可能不願意讓另外一些人到他那兒拷貝資料,這與我們jsoi宣揚的團隊合作精神格格不入!!!
現在假設總共有n個營員(2<=n<=200),每個營員的編號為1~n。lhc給每個人發了一張調查表,讓每個營員填上自己願意讓哪些人到他那兒拷貝資料。當然,如果a願意把資料拷貝給b,而b又願意把資料拷貝給c,則一旦a獲得了資料,則b,c都會獲得資料。
現在,請你編寫乙個程式,根據**上來的調查表,幫助lhc計算出組委會至少要燒錄多少張光碟,才能保證所有營員回去後都能得到夏令營資料?
輸入格式:
先是乙個數n,接下來的n行,分別表示各個營員願意把自己獲得的資料拷貝給其他哪些營員。即輸入資料的第i+1行表示第i個營員願意把資料拷貝給那些營員的編號,以乙個0結束。如果乙個營員不願意拷貝資料給任何人,則相應的行只有1個0,一行中的若干數之間用乙個空格隔開。
輸出格式:
乙個正整數,表示最少要燒錄的光碟數。
輸入樣例#1:
52 3 4 0
4 5 000
1 0
輸出樣例#1:
1
這題一開始的思路是 並查集 ,經過 n 次的 10分 後,才發現這題的路是單向,而並查集的路是雙向。。。
於是果斷 tarjan 強聯通。。。
#include#include#include#include#define maxn 250010
using namespace std;
int n,ans=0,c=1,top=1,d=1,colournum=1;
int cstack[maxn],deep[maxn],low[maxn],head[maxn],indegree[maxn],colour[maxn];
bool beque[maxn];
struct nodea[maxn<<1];
inline int read()
while(c>='0'&&c<='9')
return date*w;
}void add(int x,int y)
void work(int x)
else if(beque[t])
low[x]=min(low[x],deep[t]);
}if(low[x]==deep[x])while(cstack[--top]!=x);
}}int main()
}for(int i=1;i<=n;i++)
if(!deep[i])
work(i);
for(int i=1;i
然而發現了更簡單的演算法,o(n)級別。。。如下:
#include#include#includeusing namespace std;
int n,x,ans=0;
bool a[210];
int main()
}for(int i=1;i<=n;i++)
if(!a[i])
ans++;
printf("%d\n",ans==0?1:ans);
return 0;
}
依舊能 ac。。。
洛谷 P2835 燒錄光碟
這道題目 先把沒有入度的點去灌水一遍 然後對於剩下的每乙個圖 他們不一定是乙個環 但是一定包含乙個環 我們只要找到乙個在環上的點,那麼就可以吧整個圖都灌水 include define ll long long using namespace std const int n 205 struct c...
洛谷 P2835 燒錄光碟
其實這題水的一批.在jsoi2005夏令營快要結束的時候,很多營員提出來要把整個夏令營期間的資料燒錄成一張光碟給大家,以便大家回去後繼續學習。組委會覺得這個主意不錯!可是組委會一時沒有足夠的空光碟,沒法保證每個人都能拿到燒錄上資料的光碟,又來不及去買了,怎麼辦呢?組委會把這個難題交給了lhc,lhc...
P2835 燒錄光碟 (tarjan縮點)
題目描述 現在假設總共有n個營員 2 n 200 每個營員的編號為1 n。lhc給每個人發了一張調查表,讓每個營員填上自己願意讓哪些人到他那兒拷貝資料。當然,如果a願意把資料拷貝給b,而b又願意把資料拷貝給c,則一旦a獲得了資料,則b,c都會獲得資料。求最小需要燒錄多少張光碟。題目鏈結 演算法 ta...