Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3060 Accepted Submission(s): 1386
简单版
#include <stdio.h> #include <string.h> const int MAX = 100 + 10; int n,m,G[MAX][MAX],c[MAX]; bool DFS(int u) { c[u] = -1; for(int v = 0;v < n;v++)if(G[u][v]) { if(c[v]<0) return false; if(!c[v]&&!DFS(v)) return false; } c[u] = 1; return true; } bool TopSort() { memset(c,0,sizeof(c)); for(int v = 0;v < n;v++)if(!c[v]) if(!DFS(v)) return false; return true; } int main() { while(scanf("%d%d",&n,&m),n) { int x,y; memset(G,0,sizeof(G)); for(int i = 0;i < m;i++) { scanf("%d%d",&x,&y); G[x][y] = 1; } if(TopSort()) printf("YES\n"); else printf("NO\n"); } return 0; }
复杂版(邻接表)
#include <iostream> #include <cstdlib> #include <queue> using namespace std; const int MaxVertexNum = 100; typedef int VertexType; typedef struct node { int adjvex; node* next; }EdgeNode; typedef struct { VertexType vertex; EdgeNode* firstedge; int count; }VertexNode; typedef VertexNode AdjList[MaxVertexNum]; typedef struct { AdjList adjlist; int n,e; }ALGraph; bool CreatALGraph(ALGraph *G) { int i,j,k; EdgeNode* s; cin>>G->n>>G->e; if(G->n == 0) return false; for(i = 0;i < G->n;i++) { G->adjlist[i].vertex = i; G->adjlist[i].firstedge = NULL; } for(k = 0;k < G->e;k++) { cin>>i>>j; s = (EdgeNode *)malloc(sizeof(EdgeNode)); s->adjvex = j; s->next = G->adjlist[i].firstedge; G->adjlist[i].firstedge = s; } return true; } void TopSort(ALGraph *G) { EdgeNode *p; queue<int> Q; int i,j,cnt = 0; for(i = 0;i < G->n;i++) G->adjlist[i].count = 0; for(i = 0;i < G->n;i++) { p = G->adjlist[i].firstedge; while(p != NULL) { G->adjlist[p->adjvex].count++; p = p->next; } } for(i = 0;i < G->n;i++) if(G->adjlist[i].count == 0) Q.push(i); while(!Q.empty()) { i = Q.front(); Q.pop(); cnt++; p = G->adjlist[i].firstedge; while(p != NULL) { j = p->adjvex; G->adjlist[j].count--; if(G->adjlist[j].count == 0) Q.push(j); p = p->next; } } if(cnt != G->n) cout<<"NO"<<endl; else cout<<"YES"<<endl; } int main() { ALGraph G; while(CreatALGraph(&G)) TopSort(&G); return 0; }