- Victoria的舞会3
- 2017-05-11 13:16:45 @
#include<iostream>
#include<stack>
#include<vector>
#include<string>
using namespace std;
const int maxn=201;
int low[maxn],inw[maxn],cnt,index,pre[maxn];
vector<int> G[maxn];
stack<int> s;
int n;
void dfs(int u){
pre[u]=low[u]=++index;
s.push(u);
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(!pre[v]){
dfs(v);
low[u]=min(low[u],low[v]);
}
else if(!inw[v]){
low[u]=min(low[u],pre[v]);
}
}
if(low[u]==pre[u]){
cnt++;
for(;;){
int x=s.top();
s.pop();
inw[x]=cnt;
if(x==u) break;
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int a;
while(cin>>a&&a!=0){
G[i].push_back(a);
}
}
for(int i=1;i<=n;i++){
if(!pre[i]){
dfs(i);
}
}
cout<<cnt;
return 0;
}