有向图的拓扑序列(求拓扑序列板子)

有向图的拓扑序列
使用vector

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;

int n, m;
vector<int> res, g[N];
int d[N];

bool top_sort(){
    queue<int> q;
    for(int i = 1; i <= n; ++i) if(!d[i]) q.push(i);
    while(q.size()){
        auto t = q.front(); q.pop();
        res.push_back(t);
        for(int i = 0; i < g[t].size(); ++i){
            int u =g[t][i];
            if(--d[u] == 0) q.push(u);
        }
    }

    return res.size() == n;
}
signed main(){
    cin >> n >> m;
    for(int i = 1; i <= m; ++i){
        int x, y; cin >> x >> y; g[x].push_back(y);
        ++d[y];
    }
    if(top_sort()){
        for(int i = 0; i < res.size(); ++i) cout << res[i] << " ";
    }else cout << -1 << endl;
    
    return 0;
}

使用链表

#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> PII;

const int N = 100010;

int n, m;
int h[N], e[N], ne[N], idx;
int d[N], q[N];

void add(int a, int b){
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

bool topsort(){
	int hh = 0, tt = -1;
	

	for(int i = 1; i <= n; i++)
		if(!d[i]) q[++tt] = i; 
	
	while(hh <= tt){
		int t = q[hh++];
		
		for(int i = h[t]; i != -1; i = ne[i]){
			int j = e[i];
			
			d[j]--;
			if(!d[j]) q[++tt] = j;
		}
	}
	
	return tt == n - 1;	

}
int main(){
	cin >> n >> m;
	

	memset(h, -1, sizeof h);
	
	for(int i = 0; i < m; i++){
		int a, b;
		cin >> a >> b;
		add(a, b);
		d[b]++;
	}
	
	if(topsort()){
		for(int i = 0; i < n; i++) cout << q[i] << " ";
	}else puts("-1");
	
	return 0;

}
posted @ 2025-03-21 21:18  awei040519  阅读(9)  评论(0)    收藏  举报