求助字典序最小的拓扑序
  • 板块学术版
  • 楼主NO_OI_NO_LIFE
  • 当前回复12
  • 已保存回复12
  • 发布时间2023/12/23 21:12
  • 上次更新2023/12/24 00:53:42
查看原帖
求助字典序最小的拓扑序
746930
NO_OI_NO_LIFE楼主2023/12/23 21:12
#include <bits/stdc++.h>
using namespace std;

int n,m,x,y,deg[100005],sol[100005],tot,ans[100005],ant; 

struct node{
	int u,v;
}e[100005];int cnt=0,head[100005];

void add(int u,int v){
	e[++cnt].u=v;
	e[cnt].v=head[u];
	head[u]=cnt;
}

priority_queue<int,vector<int>,greater<int> > q;

int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>x>>y;
		add(x,y);
		deg[y]++;
	}
	tot=0;
	for(int i=1;i<=n;i++){
		if(deg[i]==0){
			ans[++ant]=i;
			tot++;
			q.push(i);
		}
	}
	while(!q.empty()){
		int x=q.top();q.pop();
		for(int i=head[x];i;i=e[i].v){
			if(--deg[e[i].u]==0){
				ans[++ant]=e[i].u;
				tot++;
				q.push(e[i].u);
			}
		}
	}
	if(tot==n)
		for(int i=1;i<=ant;i++) cout<<ans[i]<<" ";
	else cout<<-1<<endl;
    return 0;
}

样例输入

5 8
2 1
5 4
5 1
5 2
3 4
3 5
3 2
3 1
  

样例输出

3 5 2 1 4

谢谢了

2023/12/23 21:12
加载中...