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 "); else { puts("T_T "); printf("%d ", ans); } return 0; }