>description
smart準備邀請n個已經確定的人,這n個人每乙個人都有乙個名冊,名冊裡面寫著他能夠通知到的人的名字。
smart覺得需要確定自己最少需要通知到多少個人,能夠實際將所有n個人都通知到。
注意:自己的名單裡面不會有自己的名字。
>input
第一行乙個數n(1≤n≤200)。接下來n行,第i+1行表示編號為i的人的小花名冊名單,名單以0結束。
>output
乙個整數,即m的值。
>sample input
5 12 0
1 3 000
1 0>sample output
2>解題思路
方法:構乙個圖,求出其中的強連通分量,把強連通分量合為1個點。處理完後,再把入度為零的點的個數加在一起,就是m的值,也就是通知這其中入度為零的人就行了。
>**
#include
#include
#include
using namespace std;
int n,s,p[
205]
,ans;
bool a[
205]
[205
],lhq[
205]
,t,c;
int main()
}for
(int k=
1;k<=n;k++
)for
(int i=
1;i<=n;i++
)for
(int j=
1;j<=n;j++)if
(i!=j&&i!=k&&j!=k)
if(a[i]
[k]&&a[k]
[j]) a[i]
[j]=1;
//求連通的點
for(int i=
1;i<=n;i++
)//縮點
}memset
(lhq,0,
sizeof
(lhq));
for(int i=
1;i<=n;i++
)//判斷入度是否為0
if(c)
continue
; ans++;}
printf
("%d"
,ans)
;return0;
}
強連通分量 tarjan求強連通分量
雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...
強連通分量
對於有向圖的乙個頂點集,如果從這個頂點集的任何一點出發都可以到達該頂點集的其餘各個頂點,那麼該頂點集稱為該有向圖的乙個強連通分量。有向連通圖的全部頂點組成乙個強連通分量。我們可以利用tarjan演算法求強連通分量。define n 1000 struct edge e 100000 int ec,p...
強連通分量
在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 下圖中,子圖為乙個強連通分量,因為...