百度之星热身赛-1001(dfs拓扑排序)

题意:作为年度优秀魔法学员的奖赏,哈利得到了一台具有魔力的计算机。这台计算机一旦开始处理某个任务,就会一直处理到这个任务结束为止(所以你可以认为它是单线程的)。有一天,这台计算机得到了n个任务要处理,分别标号1到n。这n个任务之间又有一些依赖关系,假如存在依赖关系(a, b),那么要处理a任务,必须先将b任务完成。现在哈利得到了所有的这些依赖关系,一共m个。他想知道,这台计算机能否完成所有的任务。

思路:一开始是判断该图中是否存在环,但是WA,换成拓扑排序,A了;

 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 }
拓扑排序
原文地址:https://www.cnblogs.com/ACMERY/p/4521575.html