拓扑排序·一 拓扑排序、BFS
Source
My Solution
拓扑排序基础题,判断图中是否有环。
拓扑排序、BFS
每次把入度为0的点删除后入队,进行BFS,最后如果有剩余没有删除的点,则存在环,否则没有。
复杂度 O(n+m)
#include
#include
#include
#include
#include
using namespace std;
typedef long long LL;
typedef pair<int, int> ii;
const int MAXN = 1e5 + 8;
vector sons[MAXN];
int deg[MAXN];
queue que;
inline void bfs()
{
int fa, u, v, sz, i;
while(!que.empty()){
u = que.front().first;
fa = que.front().second;
que.pop();
sz = sons[u].size();
for(i = 0; i < sz; i++){ v = sons[u][i]; if(v == fa) continue; deg[v]--; if(deg[v] == 0) que.push(ii(v, u)); } } } int main() { #ifdef LOCAL freopen("1.in", "r", stdin); //freopen("1.out", "w", stdout); #endif // LOCAL ios::sync_with_stdio(false); cin.tie(0); int T, n, m, i, j, u, v, sz; bool ans; cin >> T;
while(T--){
memset(deg, 0, sizeof deg);
ans = true;
cin >> n >> m;
for(i = 0; i < m; i++){ cin >> u >> v;
sons[u].push_back(v);
}
for(i = 1; i <= n; i++){
sz = sons[i].size();
for(j = 0; j < sz; j++){
deg[sons[i][j]]++;
}
}
for(i = 1; i <= n; i++){
if(deg[i] == 0){
que.push(ii(i, -1));
}
}
bfs();
for(i = 1; i <= n; i++){
if(deg[i] != 0){
ans = false;
break;
}
}
if(ans) cout << "Correct" << "n";
else cout << "Wrong" << "n";
for(i = 1; i <= n; i++) sons[i].clear();
}
return 0;
}
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
https://www.prolightsfxjh.com/
Thank you!
------from ProLightsfx
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
如经许可后转载,请注明出处:https://prolightsfxjh.com/article/hihocoder-1174/
共有 0 条评论