拓扑排序

一,概念

1.DAG图:一个有向图中不存在环,则称为有向无环图,简称DAG图
2.拓扑排序:在DAG图中,所有活动可排列成一个线性序列,使得每个活动的所有前驱活动都排在该活动的前面,我们把此序列叫做拓扑序列,由DAG图构造拓扑序列的过程叫做拓扑排序

二,实现过程

First:从DAG图中选择一个没有前驱的顶点并输出
Next:从图中删除该顶点和以该顶点为起点的有向边。
Last:重复1、2,直到当前的DAG为空,或者当前图中不存在有前驱的顶点为止。如果最终图不为空,则必然存在环。

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;

int n,m;
vector<int> g[MAXN];
queue<int> q;
int in[MAXN];//每个顶点的入度

void Topsort(){
	for(int i=1;i<=n;i++){
		if(in[i]==0){
			q.push(i);
		}
	}//将入度为0的点加入队列
	while(!q.empty()){
		int t=q.front();
		cout<<t<<" ";//获得拓扑排序
		q.pop();
		for(int i=0;i<(int)g[t].size();i++){
			int idx=g[t][i];//遍历t的每个后继
			if(--in[idx]==0){//将删除边后入度为0的点加入队列
				q.push(idx);
			}
		}
	}
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		g[u].push_back(v);
		in[v]++;
	}
	return 0;
}
posted @ 2024-07-29 11:41  Form_mula  阅读(36)  评论(0)    收藏  举报