当前位置: 首页 > news >正文

织梦移动端网站建设阿里指数查询官网

织梦移动端网站建设,阿里指数查询官网,wordpress关于我们,建立网站拓扑序列:可以用来判断一个有向图是否有环! 拓扑排序可以判断有向图是否存在环。我们可以对任意有向图执行上述过程,在完成后检查A序列的长度。 若A序列的长度小于图中点的数量,则说明某些节点未被遍历,进而说明图中存…

拓扑序列:可以用来判断一个有向图是否有环!
拓扑排序可以判断有向图是否存在环。我们可以对任意有向图执行上述过程,在完成后检查A序列的长度。 若A序列的长度小于图中点的数量,则说明某些节点未被遍历,进而说明图中存在环。

拓扑排序是结合bfs框架来实现的,每次从入度为0的点开始搜索;所以需要先预处理出来所有入度为0的节点,入队,然后去遍历这些入度为0的点,每次将这些点进行逻辑上的删除,然后更新它的直接邻接点的入度,如果直接邻接点的入度减为0,则将其也入队!

  1. 建立一个队列,负责按照拓扑序列存取节点。
  2. 预处理所有点的入度d[i], 起初把所有入度为0的点入队。
  3. 取出队头节点t, 把 t 加入拓扑序列 – 队列q的末尾。
  4. 对于从x出发的每条边x->y,y即为x的直接邻接点, 把d[y]−−。若被减为0, 则把y入队。
  5. 重复第3∼4步直到队列为空, 此时队列q即为所求。

本题中心思想: 用 已确定方向的边 建好图后,给 未确定方向的边 设置方向 这部操作其实就是 加边 行为。如果当前图中已经存在 环
了,那么加额外的边是不能去掉这个 环 的(除非删掉环上的某一条边) 大致就是以上意思

由于我们只建立了有向边,而无向边的话是没有建立的,所以意味着建立的有向图不会经过所有的顶点,,那为什么生成的拓扑序列 就能够确保经过所有的顶点呢?

因为属于不同连通块亦能构成拓扑序,拓扑排序本身不会被局限在一个连通块内

对于无向边的节点,我们需要知道它在拓扑序列中的位置,而拓扑序列我们已经预处理出来了,只需要求出拓扑序列里,含无向边的两个点,让它们按照拓扑序列从前往后指向,就必然不会破坏拓扑序列并且合法!

代码:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>using namespace std;const int N = 2e5 + 10, M = N;
int T, n, m;
int top[N], pos[N];     //存放拓扑序!
int h[N], e[M], ne[M], d[N], idx;
struct Edge{int a, b;
}edge[M];void add (int a, int b)
{e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}bool topsort ()
{queue<int> q;   //定义一个队列!//预处理出来所有入度为0的节点:for (int i=1; i <= n; i ++)if (!d[i])q.push(i);int cnt = 0;while (q.size()){auto t = q.front();q.pop();top[cnt ++] = t;    //存放拓扑序列! for (int i=h[t]; ~i; i = ne[i]){int j = e[i];d[j] --;if (d[j] == 0)q.push(j);}}//判断存放的元素个数:if (cnt < n) return false;else return true;
}int main()
{cin >> T;while (T --){int cnt = 0;//初始化:memset (h, -1, sizeof (h));memset (d, 0, sizeof (d));  //度数数组!idx = 0;scanf ("%d%d", &n, &m);while (m --){int t, x, y;scanf("%d%d%d", &t, &x, &y);if (!t) edge[cnt ++] = {x, y};else{   //即为有向边!add (x, y);d[y] ++;}}if (!topsort())    //利用拓扑序列判断是否有环puts("NO");else{puts("YES");for (int i=1; i <= n; i ++) //输出拓扑序列:for (int j=h[i]; ~j; j = ne[j])printf ("%d %d\n", i, e[j]);    //指代有向边!//记录每个点的位置://pos[i]:表示的是i号节点在拓扑序列中的位置for (int i=0; i < n; i ++) pos[top[i]] = i;for (int i=0; i < cnt; i ++){int a = edge[i].a, b = edge[i].b;if (pos[a] > pos[b]) swap(a, b);printf ("%d %d\n", a, b);}}}return 0;
}```
http://www.wangmingla.cn/news/139502.html

相关文章:

  • linux服务器安装网站网页设计期末作业模板
  • 企业网站建设及运营现状分析安卓优化大师2023
  • 有哪些网站可以卖自己做的图片国外比较开放的社交软件
  • 义乌制作网站要多少钱大数据查询平台
  • 自己学做网站看什么书a5站长网网站交易
  • 粉丝网站制作免费b2b推广网站大全
  • 天津做网站建设的公司今日头条荆州新闻
  • 大学生做爰网站莫停之科技windows优化大师
  • 招商网站建设方案网络营销软文范例300字
  • 上海建设摩托车官网刷网站seo排名软件
  • 如何替换网站ico图标网站设计说明
  • 用什么系统做威客网站刷网站seo排名软件
  • 国内最炫酷的网站北京百度公司地址在哪里
  • wordpress获取文章自定义字段引擎优化搜索
  • 企业开发网站建设哪家好站长工具视频
  • 做网站有哪些公司好品牌推广策略与方式
  • 关于网站建设知识焊工培训心得体会
  • 网页模板网站模板推广普通话手抄报模板
  • 如何做阿里详情页面链接到外部网站热狗网站排名优化外包
  • 百度建站系统灰色关键词代发可测试
  • 上海房产交易中心官网哪个合肥seo好
  • 电商网站开发 报价网上兼职外宣推广怎么做
  • 安徽网站优化价格咨询上海小红书seo
  • 贵州营销型网站广告联盟平台
  • 网站模板信息不存在湖南广告优化
  • 苏州市吴江区住房和城乡建设局网站搜索引擎优化seo网站
  • 我国政府网站建设研究论文中国推广网站
  • wordpress ping服务列表seo五大经验分享
  • 怎么做网站链接的快捷方式太原seo排名
  • 如何将aaa云主机做网站网站怎样被百度收录