整理的算法模板合集: ACM模板


luogu链接

我们直接先把所有的有向边建图,然后拓扑排序判断环,如果此时有环那么直接输出no
为了将无向边变成有向边之后依旧无环,那么我们只需要遵循拓扑排序的规则,给无向图指定方向的时候对于每条边,从拓扑序小的点指向拓扑序大的点,就一定保证无环。

要注意的是本题的数据范围比较大,如果用memset把topo数组初始化的话就会TLE,但是我们实际上是不用考虑topo数组的初始化的,因为我们一直是往上覆盖的。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII ;
const int N = 500007, M = 5000007, INF = 0x3f3f3f3f;int n, m;
int head[N], ver[M], nex[M], edge[M], tot;
int topo[N], din[N];
int cnt;void add(int x, int y){ver[tot] = y;nex[tot] = head[x];head[x] = tot ++ ;din[y] ++ ;
}bool toposort(int x)
{queue<int>q;for(int i = 1; i <= n; ++ i)if(din[i] == 0)q.push(i);//入度为0的先入队while(q.size()){int x = q.front();q.pop();topo[x] = ++ cnt;//拓扑序for(int i = head[x]; ~i; i = nex[i]){int y = ver[i];if( -- din[y] == 0){q.push(y);}}}if(cnt < n)return false;return true;
}int main()
{int t ;scanf("%d", &t);while(t -- ){scanf("%d%d", &n, &m);memset(head, -1, sizeof head);memset(din, 0, sizeof din);tot = cnt = 0;vector<PII> v;for(int i = 1; i <= m; ++ i){int x, y, op;scanf("%d%d%d", &op, &x, &y);if(op == 1)add(x, y);else v.push_back({x, y});}if(!toposort(n)){puts("NO");continue;}puts("YES");for(int x = 1; x <= n; ++ x)for(int i = head[x]; ~i; i = nex[i]){int y = ver[i];printf("%d %d\n", x, y);}for(int i = 0; i < (int)v.size(); ++ i){int x = v[i].first, y = v[i].second;if(topo[x] < topo[y])printf("%d %d\n", x, y);
//只要满足拓扑序,从拓扑序小的指向拓扑序大的就一定没有环else printf("%d %d\n", y, x);}}return 0;
}

CF1385E Directing Edges (拓扑排序判断环)相关推荐

  1. CF1385E Directing Edges 拓扑序

    传送门 文章目录 题意: 思路: 题意: 给你一个图和若干个边,有些是有向边,有些是无向边,让你给无向边定向,使得最终的图是DAGDAGDAG. 思路: 题目让构造DAGDAGDAG,比较容易想到拓扑 ...

  2. CCF CSP 点亮数字人生(记忆化搜索+拓扑排序判环)

    题目背景 土豪大学的计算机系开了一门数字逻辑电路课,第一个实验叫做"点亮数字人生",要用最基础的逻辑元件组装出实际可用的电路.时间已经是深夜了,尽管实验箱上密密麻麻的连线已经拆装了 ...

  3. 【bzoj1565】[NOI2009]植物大战僵尸 拓扑排序+最大权闭合图

    原文地址:http://www.cnblogs.com/GXZlegend/p/6808268.html 题目描述 输入 输出 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何 ...

  4. POJ - 1094 Sorting It All Out(拓扑排序+floyd传递闭包)

    题目链接:点击查看 题目大意:给出N个点以及M个比较关系,问在第几个数字可以确定出唯一的序列,或者判断出矛盾的序列,或者最后也无法确定出一个唯一的序列 题目分析:关于这个题目可以直接分类讨论,可以直接 ...

  5. topo排序判环实操

    项目场景: 有一张订单表,和订单关系表,订单关系表中维护订单与订单之间的父子关系(多对多). 现在需要根据目标订单id去查询到目标订单关系的完整链路与链路中订单信息集合,并且判断链路是否有成环现象. ...

  6. Sorting It All Out (易错题+拓扑排序+有向图(判环+判有序)优先级)

    这道题目考察了拓扑排序的基本思想:每一步寻找一个入度为0的结点,然后 删除之.将这个结点指向的结点入度减1.删除从这个结点出发的所有边 同时考察了对于一个有向图是否有环.是否严格有序的判断.(当发现多 ...

  7. Robots on a Grid CodeForces - 1335F(拓扑排序+正反建图+判环)

    There is a rectangular grid of size n×m. Each cell of the grid is colored black ('0') or white ('1') ...

  8. 【蓝桥杯官网试题 - 历届试题】发现环(dfs+并查集,或无向图tarjan判环,无向环,或拓扑排序)

    题干: 问题描述 小明的实验室有N台电脑,编号1~N.原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络.在树形网络上,任意两台电脑之间有唯一的路径相连. 不过在最近一次维护网络时,管理员 ...

  9. 拓扑排序【Kahn算法(bfs)和dfs求拓扑序列及判环】

    拓扑排序 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,该排序满足这样的条件--对于图中的任意两个结点u和v,若存在一条有 ...

最新文章

  1. 第二阶段第八次spring会议
  2. javascript操作表单
  3. 公共资源情报(OSINT)工具Automater
  4. PBRT笔记(2)——BVH
  5. ICCV 2019 | VrR-VG:聚焦视觉相关关系
  6. 在 ASP.NET Core 中安装 MVC
  7. npy一维数组如何对给出的索引进行反选
  8. 算法——排序——堆排序图解动画
  9. matlab里面的xlsread函数坏,MATLAB的xlsread坏了
  10. html收款页面模板,好得很CMS WEB打印收款收据模板HTML源码
  11. js中如何获取font标签中的内容
  12. 常见电脑故障之网络不通
  13. pdf文件怎么转换成图片
  14. 吴恩达机器学习课后作业Python实现(二):逻辑回归
  15. 恶意程序利用Linksys路由器漏洞在路由器中传播
  16. 一个优秀的国产ITSM软件应该有哪些特性?
  17. Java 百度地图 根据名称获取坐标(经纬度)
  18. UltraISO 9安装教程
  19. 让你流泪的不是毕业,而是无法再重走一次的青春
  20. 股票 - - 常用指标【中】

热门文章

  1. 研究SLAM,对编程的要求有多高?
  2. 人工智能市场兴起,哪款聊天机器人能提供最好的投资回报?
  3. PHP 错误抛出及自定义处理
  4. linux设置ulimit值永久生效
  5. iOS开发中的 地区转经纬 经纬度转地区
  6. Hadoop + HBase (自带zookeeper 也可单独加) 集群部署
  7. github心得体会
  8. 远程连接docker中的mysql容器_docker构建mysql容器及Navicat 远程连接
  9. Python爬虫之破解百度翻译--requests案例详解(一)
  10. matlab二值化图像_小白啃骨头之图像识别