拓扑排序

 

 

拓扑排序的核心就是 找入度为零的点,然后把于该点相连接的边去掉,同时更新剩余点的入度,由于n可能很大,需要邻接表,(这里用vector模拟),也可以学习链式向前星。
点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+7;
int n,m;
vector<int> v[N];
int in[N];
int out[N];
int a[N]; 
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
    cin>>n>>m;
    int x,y;
    for(int i=0;i<m;i++)
    {
        cin>>x>>y;
  //      out[x]++; //出度 
        in[y]++;//入度 
        v[x].push_back(y); //模拟邻接表存边 
    }
    priority_queue<int,vector<int>,greater<int>> q; //由于要求在同等条件下,编号小的顶点在前。所以这里选择用优先队列 
    int idx=0; 
    for(int i=1;i<=n;i++) //  先把入度为0的放入 队列 
    {
        if(in[i]==0)
        {
            q.push(i); 
        }
    }
    while(!q.empty())
    {
        int w=q.top(); //队首一定是同约束条件下最小值 
        q.pop();
        a[idx++]=w;
        for(int i=0;i<v[w].size();i++) //遍历以当前点为起点的边 
        {
            in[v[w][i]]--; //终点入度减一 
            if(in[v[w][i]]==0)
			{
				q.push(v[w][i]);//如果当前入度为0 就放入队列 
			}
        }
    }
    cout<<"v"<<a[0];
    for(int i=1;i<n;i++)
    {
        cout<<" v"<<a[i];
    }
    return 0;
}
posted @ 2023-03-10 17:13  xxj112  阅读(25)  评论(0)    收藏  举报