记录编号 192474 评测结果 AAAAAAAAAA
题目名称 [金陵中学2007] 传话 最终得分 100
用户昵称 Gravatar啊吧啦吧啦吧 是否通过 通过
代码语言 C++ 运行时间 0.005 s
提交时间 2015-10-11 07:56:19 内存使用 0.34 MiB
显示代码纯文本
#include <vector>
#include <algorithm>
#include <stack>
#include <iostream>
#include <fstream>
#define cin fin
#define cout fout

using namespace std;
typedef vector<int> vi;

ifstream fin("messagez.in");
ofstream fout("messagez.out");
const int MAXN(1001), MAXM(10001);
int n, m, dfs_clock, scc_cnt, pre[MAXN], lowlink[MAXN], sccno[MAXN];
vi g[MAXN];
stack<int> s;
inline void find_scc();
void dfs(int);

main()
{
	cin >> n >> m;
	while (m--){
		int x, y;
		cin >> x >> y;
		g[x].push_back(y);
	}
	fin.close();
	
	find_scc();
	
	for (int i = 1; i <= n; ++i){
		vi::iterator it;
		for (it = g[i].begin(); it != g[i].end(); ++it)
			if (sccno[i] == sccno[*it]){
				cout << "T\n";
				break;
			}
		if (it == g[i].end())
			cout << "F\n";
	}
	fout.close();
//	for (; ; );
}

inline void find_scc(){
	dfs_clock = scc_cnt = 0;
	for (int i = 1; i <= n; ++i)
		if (! pre[i])
			dfs(i);
}

void dfs(int u)
{
	pre[u] = lowlink[u] = ++dfs_clock;
	s.push(u);
	for (vi::iterator it = g[u].begin(); it != g[u].end(); ++it)
		if (! pre[*it]){
			dfs(*it);
			lowlink[u] = min(lowlink[u], lowlink[*it]);
		}
		else if (! sccno[*it])
			lowlink[u] = min(lowlink[u], pre[*it]);
	if (lowlink[u] == pre[u]){
		++scc_cnt;
		for (; ; ){
			int x = s.top();
			s.pop();
			sccno[x] = scc_cnt;
			if (x == u)
				break;
		}
	}
}