题意:作为年度优秀魔法学员的奖赏,哈利得到了一台具有魔力的计算机。这台计算机一旦开始处理某个任务,就会一直处理到这个任务结束为止(所以你可以认为它是单线程的)。有一天,这台计算机得到了n个任务要处理,分别标号1到n。这n个任务之间又有一些依赖关系,假如存在依赖关系(a, b),那么要处理a任务,必须先将b任务完成。现在哈利得到了所有的这些依赖关系,一共m个。他想知道,这台计算机能否完成所有的任务。
思路:一开始是判断该图中是否存在环,但是WA,换成拓扑排序,A了;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cmath> 3 #include <cstdio> 4 #include <cstring> 5 #include <cstdlib> 6 #include <string> 7 #include <sstream> 8 #include <algorithm> 9 #define Max 2147483647 10 #define INF 0x7fffffff 11 #define N 2010 12 #define ll long long 13 #define mem(a,b) memset(a,b,sizeof(a)) 14 #define repu(i, a, b) for(int i = (a); i < (b); i++) 15 const double PI=-acos(-1.0); 16 using namespace std; 17 int vis[N]; 18 int topo[N],t; 19 int n,G[N][N]; 20 bool dfs(int u) 21 { 22 vis[u] = -1; 23 repu(v,1,1+n) 24 if(G[u][v]) 25 { 26 if(vis[v] < 0) 27 return false; 28 else if(!vis[v] && !dfs(v)) 29 return false; 30 } 31 vis[u] = 1; 32 topo[--t] = u;///记录路径 33 return true; 34 } 35 36 bool toposort() 37 { 38 t = n; 39 memset(vis,0,sizeof(vis)); 40 repu(u,1,1+n) 41 if(!vis[u]) 42 if(!dfs(u)) 43 return false; 44 return true; 45 } 46 47 int main() 48 { 49 int m,a,b; 50 while(cin>>n) 51 { 52 cin>>m; 53 memset(G,0,sizeof(G)); 54 repu(i,0,m) 55 { 56 cin>>a>>b; 57 G[a][b] = 1; 58 } 59 if(toposort())cout<<"YES "; 60 else 61 cout<<"NO "; 62 } 63 return 0; 64 }