图论:拓扑排序+应用
拓扑排序
概念
从入度为0的点开始 依次删边改图进行排序 这样的排序方式就是拓扑排序
删除点的按顺序所组成的数列就是拓扑序
显然 拓扑序是不唯一的 且 可以证明一个含有闭环的图没有拓扑序
实现
法1: 队列
首先用邻接表存图
并统计每个点的入度
然后开一个拓扑序队列
接着选择每次取出队头
如果此时有一些点的入度减为
最后队列里所以点的出队顺序即为拓扑序
#include<bits/stdc++.h> const int N=1e5+10; using namespace std; vector<int> e[N]; int d[N]; int main() { //topo排序 方法1:队列 int n,m; cin>>n>>m; for(int i=1;i<=m;++i) { int u,v; cin>>u>>v; e[u].push_back(v); ++d[v]; } queue<int> q,ans; for(int i=1;i<=n;++i) if(d[i]==0) q.push(i); while(!q.empty()) { int fr=q.front(); ans.push(fr); q.pop(); for(int i=0;i<e[fr].size();++i) { int v=e[fr][i]; --d[v]; if(d[v]==0) q.push(v); } } int size=ans.size(); if(size!=n) cout<<-1; else while(!ans.empty()) cout<<ans.front()<<" ",ans.pop(); return 0; }
法2: 染色法
考虑染色法 定义三种颜色状态
我们可以这样操作:以每个点为中心进行
如果遇到了颜色为
遇到颜色为
而全部染色完成后将染色点的顺序逆向存储于队列中
显然此时的存储顺序应该与图的拓扑序相反 进行reverse()操作反向即可
本文作者:SamXia
本文链接:https://www.cnblogs.com/SamXia/p/18709170
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步