思路:
显然按照他的意思建图肯定不行。
对于u所需要先解决的v[], 建边 u -> v[], 然后就是判断一下每个main 课程是否在一个环里,或者是不是他需要先修的课程在环里,这样子就不满足。
然后我就很爆炸,窝很蠢地想到了Tarjan,然后就处理了一下那些强连通分量,然后就是用来判断是不是在环里,不满足。
然后就是对每个main 课程 DFS搜,然后就好啦,然后智障的窝第一次发现这个拓扑排序的逆序竟然是DFS序。。。
因为菜啊!!不会一次DFS就能判断= =、就瞄了瞄题解。。我就不多bb了…思路基本一样。。。但是人家的写法。。(窝看到的时候内心是崩溃的)
void dfs(int u) {
if (color[u] == 0) {
color[u] = 1;
for (int to: g[u])
dfs(to);
color[u] = 2;
ord.push_back(u);
} else if (color[u] == 1)
cycle = true;
}
然后我的搓代码。。(其实单组案例可以去掉那些没必要的初化)
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
#include<list>
using namespace std;
typedef pair<int,int> PII;
typedef long long LL;
#define mem(a, b) memset(a, b