记录编号 85020 评测结果 AAAAAAAAAAA
题目名称 [USACO 5.3] 校园网 最终得分 100
用户昵称 Gravatarranto 是否通过 通过
代码语言 C++ 运行时间 0.005 s
提交时间 2013-12-23 20:45:25 内存使用 0.31 MiB
显示代码纯文本
#include <fstream>
#include <list>

using namespace std;

ifstream in("schlnet.in");
ofstream out("schlnet.out");

int n;
list<int> map[101];
list<int> rmap[101];

void input();
void proc();

int main()
{
	input();
	proc();
	return 0;
}

void input()
{
	in>> n;
	register int itemp;
	for(int i=1; i!=n+1; ++i)
	{
		in>> itemp;
		while(itemp!=0)
		{
			map[i].push_back(itemp);
			rmap[itemp].push_back(i);
			in>> itemp;
		}
	}
	return ;
}

int *used;
list<int> f;
int *ref;
int *res;

void dfsf(int a)
{
	used[a]=1;
	for(list<int>::iterator it=map[a].begin(); it!=map[a].end(); ++it)
	{
		if(!used[*it])
		{
			dfsf(*it);
		}
	}
	f.push_front(a);
	return ;
}

void dfss(int a, int r)
{
	used[a]=1;
	for(list<int>::iterator it=rmap[a].begin(); it!=rmap[a].end(); ++it)
	{
		if(!used[*it])
		{
			ref[*it]=r;
			dfss(*it, r);
		}
	}
	return ;
}

void debug(int i)

{
	used[i]=1;
	for(list<int>::iterator it=map[i].begin(); it!=map[i].end(); ++it)
	{
		if(!used[*it]&&!map[*it].empty())
		{
			out<< *it<< ' ';
			debug(*it);
		}
	}
	return ;
}

void proc()
{
	used=new int [n+1];
	ref=new int[n+1];
	res=new int[n+1];
	int *ctin=new int[n+1];
	int *ctout=new int [n+1];
	for(int i=1; i!=n+1; ++i)
	{
		used[i]=0;
		res[i]=0;
		ctin[i]=0;
		ctout[i]=0;
	}
	for(int i=1; i!=n+1; ++i)
	{
		if(!used[i])
		{
			dfsf(i);
		}
	}
	for(int i=1; i!=n+1; ++i)
	{
		used[i]=0;
	}
	int rest(0);
	for(list<int>::iterator it=f.begin(); it!=f.end(); ++it)
	{	
		if(!used[*it])
		{
			res[*it]=1;//缩点结果
			++rest;
			used[*it]=1;
			if(!rmap[*it].empty())
			{
				ref[*it]=*it;
				dfss(*it, *it);
			}
			else
			{
				ref[*it]=*it;
			}
		}
	}
	/*
	for(int i=1; i!=n+1; ++i)
	{
		out<<i <<':' << ref[i]<< ' ';
	}
	out<< endl;
	for(int i=1; i!=n+1; ++i)
	{
		out<< res[i]<< ' ';
	}
	out<< endl;
	*/
	if(rest==1)
	{
		out<< 1<< endl;
		out<< 0<< endl;
		return ;
	}
	int icount(0);
	int ocount(0);
	for(int i=1; i!=n+1; ++i)
	{
		list<int>::iterator it(map[i].begin());
		while(it!=map[i].end())
		{
			if(ref[*it]!=ref[i])
			{
				ctin[ref[i]]=1;
				break;
			}
			++it;
		}
		it=rmap[i].begin();
		while(it!=rmap[i].end())
		{
			if(ref[*it]!=ref[i])
			{
				ctout[ref[i]]=1;
				break;
			}
			++it;
		}
	}
	for(int i=1; i!=n+1; ++i)
	{
		if(res[i])
		{
			if(ctin[i]==0)
			{
				++icount;
			}
			if(ctout[i]==0)
			{
				++ocount;
				/*for(int j=1; j!=n+1; ++j)
				{
					used[j]=0;
				}
				out<< i<< ' ';
				debug(i);
				out<< endl;*/
			}
		}
	}
	out<< ocount<< endl;
	out<< (icount>ocount?icount:ocount)<< endl;
	return ;
}