记录编号 250362 评测结果 AAAAAAAAAA
题目名称 [WZOI 2011 S3] 消息传递 最终得分 100
用户昵称 GravatarMarvolo 是否通过 通过
代码语言 C++ 运行时间 0.641 s
提交时间 2016-04-14 21:36:00 内存使用 27.40 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;

long long i,n,m,a,b,zh,dp,d;
long long bh[1000010],s[1000010],bj[1000010];
long long f[100010],v[100010];
long long dfn[100010],low[100010];

vector<long long> l[100010];

long long min(long long a,long long b){return (a<b)?a:b;}

void print(long long q){
	zh++;
	bh[zh]++;
	bj[q]=zh;
	while (s[dp]!=q) {
		bh[zh]++;
		f[s[dp]]=0;
		bj[s[dp]]=zh;
		dp--;
	}
	f[s[dp]]=0;
	dp--;
	return;
}

void dfs(long long x){
	long long i;
	d++;
	dfn[x]=low[x]=d;
	dp++;
	s[dp]=x;
	f[x]=1;
	
	/*cout<<"-------"<<endl;
	writeln(d);
	writeln(dp);
	writeln(x);
	cout<<"-------"<<endl;*/
	
	if (l[x].size()!=0) for (i=0;i<=l[x].size()-1;i++)
	{
	//	cout<<"'''"<<endl;
	//	writeln(l[x][i]);
	//	cout<<"'''"<<endl;
		if (v[l[x][i]]==0) {
			v[l[x][i]]=1;
			dfs(l[x][i]);
			low[x]=min(low[x],low[l[x][i]]);
		} else
		if (f[l[x][i]]==1) low[x]=min(low[x],dfn[l[x][i]]);
	}
	if (low[x]==dfn[x]) print(x);
	return;
}

int main(){
	freopen("messagew.in","r",stdin);
	freopen("messagew.out","w",stdout);
	scanf("%d%d",&n,&m);

	for (i=1;i<=m;i++)
	{
		scanf("%d%d",&a,&b);
		if (a==b) continue;
		l[a].push_back(b);	
	}
	
	for (i=1;i<=n;i++)
	{
		if (v[i]==0) {
			v[i]=1;
			dfs(i);
		}
	}
	for (i=1;i<=n;i++)
	if (bh[bj[i]]>1) printf("T\n"); else printf("F\n");
	return 0;
}