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;
}