博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图论 拓扑排序
阅读量:4493 次
发布时间:2019-06-08

本文共 2141 字,大约阅读时间需要 7 分钟。

拓扑排序

就系按图中节点度的个数来排序,入度少优先

存图时用数组统计每个节点的入度,用队列/数组模拟,入度为0的先入队,遍历相邻节点,入度--,入度为0的再入队,同时存点,直至队列为空

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;const int INF=0x3f3f3f3f;typedef pair
p;typedef long long ll;#define fi first#define se second#define MAXN 100000+5#define NIL -1#define me(x) memset(x, -1, sizeof(x))#define mem(x) memset(x, 0, sizeof(x))struct node{ int next, to; //edge[i].to 存 第i条边 的终点 .next存与边i同起点的前一条边}edge[MAXN];int head[MAXN]; //head[i] i为有边节点 head存该节点 边 的最大编号 存的是边int cnt;int indegree[MAXN];void add(int u, int v){ edge[cnt].to=v; edge[cnt].next=head[u]; head[u]=cnt++;}int main(){ int i, j, k, l; int n, m; int u, v; while(cin>>n>>m && (n||m)) //n节点个数 m边数 一个节点可能有多条边 { cnt=0; me(head); mem(indegree); for(i=0; i
>u>>v, indegree[v]++, add(u, v); int que[MAXN];//存节点 int iq=0; for(i=1; i<=n; i++) if(!indegree[i]) que[iq++]=i; //int x[MAXN]; j=0; for(i=0; i
=0; k--) { indegree[edge[k].to]--;//顺序输出的话 这三行k改为x[k] if(!indegree[edge[k].to]) que[iq++]=edge[k].to; } if(iq

一般拓扑排序都按字典序最小输出,这里要求数字最小先输出

先反向建图,改用优先队列,最后逆序输出就好了

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;#define mem(x) memset(x, 0, sizeof(x))#define me(x) memset(x, -1, sizeof(x))#define lowbit(x) x&-xconst ll MOD = 1e18;const int N = 2e5 + 5;struct node{ int to, next;}e[N];int id, head[N], dep[N];void add(int u, int v){ e[id].to=v; e[id].next=head[u]; head[u]=id++;}struct cmp{ bool operator() (const int &a, const int &b) const { return a
, cmp> q; for(i=1; i<=n; i++) if(!dep[i]) q.push(i); int b[N], l=0; while(q.size()) { k=q.top(); b[l++]=k; q.pop(); for(i=head[k]; ~i; i=e[i].next) { if(dep[e[i].to]) dep[e[i].to]--; if(!dep[e[i].to]) q.push(e[i].to); } } for(i=l-1; i>=1; i--) printf("%d ", b[i]); printf("%d\n", b[i]); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/op-z/p/11283090.html

你可能感兴趣的文章
MySQL相关小技巧
查看>>
SSH整合-&nbsp;2-&nbsp;add&nbsp;service&nbsp;layout
查看>>
IP地址与UInt之间不得不说的故事
查看>>
【代码笔记】iOS-两个滚动条,上下都能滑动
查看>>
矩阵乘法-洛谷P2233 [HNOI2002] 公交车路线
查看>>
openstack云主机硬盘复制查询
查看>>
写个神经网络,让她认得我`(๑•ᴗ•๑)(Tensorflow,opencv,dlib,cnn,人脸识别)
查看>>
《程序是怎样跑起来的》第三章
查看>>
Jquery回到顶部效果
查看>>
开园第一笔
查看>>
Spark项目之电商用户行为分析大数据平台之(七)数据调研--基本数据结构介绍...
查看>>
原来fb可以在一个工程里面输出多个swf模块
查看>>
Codeforces Round #271 (Div. 2) E. Pillars 线段树优化dp
查看>>
Codeforces Round #FF (Div. 2) D. DZY Loves Modification 优先队列
查看>>
【学习】logger
查看>>
Delphi APP 開發入門(十)REST Client 開發
查看>>
elk
查看>>
.net 模糊匹配路径
查看>>
用包来组织模型
查看>>
ORA-29857: 表空间中存在域索引和/或次级对象
查看>>