拓扑排序
1.找到无入度的顶点
2.任选其中一点写入排序队列
擦掉,重复找无入度顶点
2,3入队 2出队 3出队,1,5入队 1出队,7入队 5出队 7出队,4,6入队 4出队 6出队 tp: 2 3 1 5 7 4 6
vector<int> e[N],tp;//e[x] 存点x 的邻点,tp 存拓扑序列din[x] 存点x的入度 int din[N]; bool toposort(){ queue<int> q; for(int i=1;i<=n;i++) if(din[i]==0) q.push(i);//初始化,队列 q 压入所有入度为 0的点 while(!q.empty()){ int x=q.front();q.pop();//先访问队首,再取出队首 tp.push_back(x);// 每次从 q 中取出一个点 x 放入数组 tp //然后将x的所有出边删除。若将边(x,y) 删除后,y 的入度变为0,则将y压入q中 for(auto y : e[x]){//枚举x的邻点 if(--din[y]==0) q.push(y); } } //若tp中的元素个数等于 n,则有拓扑序;否则,有环 return tp.size()==n; } int main(){ cin>>n>>m; for(int i=0;i<m;i++){ cin>>a>>b; e[a].push_back(b); din[b]++; } if(!toposort()) puts("-1"); else for(auto x:tp)printf("%d",x); return 0; }