拓扑排序

拓扑排序的核心就是 找入度为零的点,然后把于该点相连接的边去掉,同时更新剩余点的入度,由于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;
}