【模板】拓扑排序

#include<bits/stdc++.h> 
using namespace std;
const int N=205;
const int M=20005;

void read(int &x) {
	int f=1;x=0;char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	x*=f;
}

priority_queue<int,vector<int>,greater<int> > q;
vector<int> son[N];
vector<int> ans;
int in[N],n,m;

void topsort() {
	for(int i=1;i<=n;i++) if(!in[i]) q.push(i);
	while(q.size()) {
		int x=q.top();q.pop();
		ans.push_back(x);
		for(int i=0;i<son[x].size();i++) {
			int y=son[x][i];
			in[y]--;
			if(!in[y]) q.push(y);
		}
	}
}


int main() {
	read(n),read(m);
	for(int i=1;i<=m;i++) {
		int x,y;
		read(x),read(y);
		son[x].push_back(y);
		in[y]++;
	}
	topsort();
    if(ans.size()==n) {
		for(int i=0;i<n;i++) printf("%d ",ans[i]);
	}
	else printf("no solution");
}
posted @ 2020-08-18 15:07  仰望星空的蚂蚁  阅读(14)  评论(0)    收藏  举报  来源