记录编号 69417 评测结果 AAAAAAAAAA
题目名称 [金陵中学2007] 传话 最终得分 100
用户昵称 Gravatar老师好~~~ 是否通过 通过
代码语言 C++ 运行时间 0.030 s
提交时间 2013-09-15 11:53:18 内存使用 4.17 MiB
显示代码纯文本
#include<fstream>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
ifstream fin("messagez.in");
ofstream fout("messagez.out");
int a[1001][1001],color[1001],t[1001],f[1001];//t数组与f数组分别记录图中结点变灰与变黑的时间
int n,m,shijian=0;
int flag[1001];
int ans[1001];
int K=1;
int temp;
class woca
{
public:
	int x;
	int y;
}b[1001];
bool compare(woca n,woca m)
{
	if(n.y>m.y)
		return 1;
	else
		return 0;
}
void dfs(int x)//第一遍深搜把时间戳搞出来
{
	color[x]=1;t[x]=++shijian;
	for(int i=1;i<=n;i++)
	{
		if(a[x][i]==1&&color[i]==0)//只搜白色顶点
			dfs(i);
	}
	color[x]=2;f[x]=++shijian;
}
void SCC(int x)//第二次深搜求强联通分量
{
	flag[x]=temp;
	for(int i=1;i<=n;i++)
	{
		if(a[i][x]==1&&flag[i]==0)
		{
			K++;
			SCC(i);
		}
	}
}
int main()
{
	int A,B;
	fin>>n>>m;
	int i,j;
	for(i=1;i<=m;i++)
	{
		fin>>A>>B;
		a[A][B]=1;
	}
	for(i=1;i<=n;i++)
	{
		if(color[i]==0)
			dfs(i);
	}
	for(i=1;i<=n;i++)
	{
		b[i].x=i;
		b[i].y=f[i];
	}
	sort(b+1,b+n+1,compare);
	for(i=1;i<=n;i++)
	{
		temp=b[i].x;
		if(ans[b[i].x]==0)
		{                  //深搜时经历了哪些点,并放在一个连通块中
			ans[b[i].x]=1;
			SCC(b[i].x);
			for(j=1;j<=n;j++)
			{
				if(flag[j]==b[i].x)
					ans[j]=K;//K记录连通块中的个数,对于本题来说等于1的无法传回,大于一的可以传回
			}
		}
		K=1;
	}
	for(i=1;i<=n;i++)
	{
		if(ans[i]==1)
			fout<<'F'<<endl;
		if(ans[i]>1)
			fout<<'T'<<endl;
	}
	return 0;
}