【图论】拓扑排序
边 \((u,v)\) 表示 u 的拓扑序在 v 之前。
因为是先从入度为0的点开始消。
struct Graph {
static const int MAXN = 2e5 + 10;
int n;
vector<int> eout[MAXN];
int din[MAXN];
int topo[MAXN];
void init(int n) {
this->n = n;
for(int i = 1; i <= n; ++i) {
eout[i].clear();
din[i] = 0;
}
}
void addEdge(int u, int v) {
eout[u].eb(v);
++din[v];
}
bool topoSort() {
int ft = 1, bk = 0;
for(int i = 1; i <= n; ++i) {
if(din[i] == 0)
topo[++bk] = i;
}
while(ft <= bk) {
int u = topo[ft++];
for(int &v : eout[u]) {
--din[v];
if(din[v] == 0)
topo[++bk] = v;
}
}
return bk == n;
}
} G;