/*==================================================*\
| topoSort -- 使用dfs
| 使用dfs难以保证topo结果为最小的顺序
\*==================================================*/
int n, m, a, b, G[maxn][maxn];
int c[maxn]; //0 1 -1 未访问过 已访问过全部孩子 正在访问
int topo[maxn], t; //保存结果
bool dfs(int u) {
c[u] = -1; //标记正在访问
for(int v = 1; v <= n; ++v) {
if(G[u][v]) {
if(c[v] < 0) return 0;
else if(!c[v] && !dfs(v)) return 0; //递归访问相关点,返回有环的情况
}
}
c[u] = 1; //访问结束
topo[t--] = u; //记录结果
return 1;
}
bool topoSort() {
t = n; met(c, 0);
for(int u = 1; u <= n; ++u) if(!c[u]) {
if(!dfs(u)) return 0;
}
return 1;
}
/*==================================================*\
| topoSort -- 使用bfs
\*==================================================*/
vector<int> G[maxn];
int in[maxn]; //入度
int topo[maxn], t;
bool topoSort() {
priority_queue<int, vector<int>, greater<int> > q; t = 0; //优先队列保证最小序列
for(int i = 1; i <= n; ++i) {
if(in[i] == 0) q.push(i);
}
int cnt = 0;
while(!q.empty()) {
int u = q.top(); q.pop();
topo[t++] = u; ++cnt;
for(int v = 0; v < G[u].size(); ++v) {
if(--in[G[u][v]] == 0) q.push(G[u][v]); //找入度为0的边入队
}
}
if(cnt != n) return 0; //有环
return 1;
}
拓扑排序模板
最新推荐文章于 2022-04-08 20:02:50 发布