记录编号 454152 评测结果 AAAAAAAAAA
题目名称 网络病毒 最终得分 100
用户昵称 GravatarRegnig Etalsnart 是否通过 通过
代码语言 C++ 运行时间 0.359 s
提交时间 2017-09-28 14:11:15 内存使用 2.05 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=1001;
int n,ans,dfn[maxn],vis[maxn],COL[maxn],color,cnt,i;
vector<int>G[maxn],GG[maxn],col[maxn],v[maxn];
void dfs1(int now)
{
	vis[now]=1;
	for(int j=0;j<G[now].size();j++)
	{
		int to=G[now][j];
		if(!vis[to])dfs1(to);
	}
	dfn[++cnt]=now;
	return;
}
void dfs2(int now)
{
	vis[now]=1;
	col[color].push_back(now);
	for(int j=0;j<GG[now].size();j++)
	{
		int to=GG[now][j];
		if(!vis[to])dfs2(to);
	}
	return;
}
int Main()
{
	freopen("virus.in","r",stdin);freopen("virus.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;i++)for(int j=1;j<=n;j++)
	{
		int fuck;
		scanf("%d",&fuck);
		if((i!=j)&&(fuck))
		{
			G[i].push_back(j);
			GG[j].push_back(i);
		}
	}
	for(i=1;i<=n;i++)if(!vis[i])dfs1(i);
	memset(vis,0,sizeof(vis));
	for(i=n;i>=1;i--)if(!vis[dfn[i]]){color++;dfs2(dfn[i]);}
	memset(vis,0,sizeof(vis));
	for(i=1;i<=color;i++)for(int j=0;j<col[i].size();j++)
		COL[col[i][j]]=i;
	for(i=1;i<=n;i++)
	{
		int now=COL[i];
		for(int j=0;j<G[i].size();j++)
		{
			int to=COL[G[i][j]];
			if(now==to)continue;
			v[now].push_back(to);
		}
	}
	for(i=1;i<=color;i++)for(int j=0;j<v[i].size();j++)
		vis[v[i][j]]=1;
	for(i=1;i<=color;i++)if(!vis[i])ans++;
	printf("%d\n",ans);
	return 0;
}
int main(){;}
int syy=Main();