记录编号 |
467717 |
评测结果 |
AAAAAAAAAA |
题目名称 |
网络病毒 |
最终得分 |
100 |
用户昵称 |
Shirry |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.340 s |
提交时间 |
2017-10-30 23:53:50 |
内存使用 |
0.35 MiB |
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
int n,a,cnt,top,idx,ans,in[1010],dfn[1010],low[1010],stack[1010],instack[1010],belong[1010];
vector<int>p[1010],G[1010];
void tarjan(int x){
stack[++top]=x;
low[x]=dfn[x]=++idx;
instack[x]=1;
for(int i=0;i<(int)p[x].size();i++){
int u=p[x][i];
if(!dfn[u])
tarjan(u),low[x]=min(low[u],low[x]);
else if(instack[u])low[x]=min(low[x],dfn[u]);
}
if(low[x]==dfn[x]){
cnt++;int k=0;
while(k!=x&&top){
k=stack[top];
instack[k]=0,belong[k]=cnt;
top--;
}
}
}
int main(){
freopen("virus.in","r",stdin);
freopen("virus.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){scanf("%d",&a);if(a)p[i].push_back(j);}
for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
for(int i=1;i<=n;i++){
for(int j=0;j<(int)p[i].size();j++){
int u=p[i][j];
if(belong[i]==belong[u])continue;
for(int k=0;k<(int)G[belong[i]].size();k++)
if(G[belong[i]][k]==belong[u])break;
G[belong[i]].push_back(belong[u]);
in[belong[u]]++;
}
}
for(int i=1;i<=cnt;i++)if(!in[i])ans++;
printf("%d\n",ans);
return 0;
}