http://wikioi.com/problem/2833/
拓扑排序,居然1A,哈哈。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <memory.h>
#define MAX(a, b) a>b?a:b
#define LEN 105
using namespace std; int main()
{
int n, m;
scanf("%d%d", &n, &m);
vector<vector<int> > graph(n+1);
vector<int> indegree(n+1);
vector<bool> visit(n+1);
int ans = n;
while (m--) {
int x = 0;
int y = 0;
scanf("%d%d", &x, &y);
indegree[y]++;
graph[x].push_back(y);
}
queue<int> que;
for (int i = 1; i <= n; i++) {
if (indegree[i] == 0) {
que.push(i);
visit[i] = true;
ans--;
}
}
while (!que.empty()) {
int node = que.front();
que.pop();
for (int i = 0; i < graph[node].size(); i++) {
if (!visit[graph[node][i]]) {
indegree[graph[node][i]]--;
if (indegree[graph[node][i]] == 0) {
que.push(graph[node][i]);
visit[graph[node][i]] = true;
ans--;
}
}
}
}
if (ans == 0) puts("o(∩_∩)o\n");
else {
puts("T_T\n");
printf("%d\n", ans);
}
return 0;
}