http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1081
不是太会写拓扑排序,所以再写一遍。
/*Accepted 880 kb 268 ms C++/ 1671 B 2012-07-29 17:08:30*/ #include<cstdio> #include<cstring> #include<cstdlib>const int MAXN = 1 << 10; const int MAXM = 10010;int N, K, M, first[MAXN], e, next[MAXM], v[MAXM]; int topo[MAXN], cnt, vis[MAXN];void addedge(int x, int y) {v[e] = y;next[e] = first[x], first[x] = e ++; }void ReadGraph() {int i, x, y;memset(first, -1, sizeof first);e = 0;for(i = 0; i < M; i ++){scanf("%d%d", &x, &y);addedge(x, y);} }void dfs(int cur) {int i;vis[cur] = 1;for(i = first[cur]; i != -1; i = next[i])if(!vis[v[i]])dfs(v[i]);topo[cnt --] = cur; }void toposort() {int i;cnt = N;memset(vis, 0, sizeof vis);for(i = 1; i <= N; i ++)if(!vis[i])dfs(i); }void Search(int cur) {int i;vis[cur] = 1;for(i = first[cur]; i != -1; i = next[i])if(!vis[v[i]])Search(v[i]); }bool judge() {int i, j;for(i = 1; i <= K; i ++){memset(vis, 0, sizeof vis);Search(topo[i]);for(j = K + 1; j <= N; j ++)if(!vis[topo[j]])return false;}return true; }int main() {while(scanf("%d%d%d", &N, &K, &M) == 3){ReadGraph();toposort();bool ok = judge();if(ok)printf("YES\n");elseprintf("NO\n");}return 0; }