题目链接:点击查看

题目大意:给出 n 个变量以及 m 个不等式,要求给 n 个变量分配作用域,使得所有不等式成立的前提下,“所有”的出现次数最多,给出一种构造方案

题目分析:因为有 m 个不等式的限制,结合样例画了画图,感觉像是拓扑排序,比赛时大胆猜测了一个结论:建好图后如果图中有环,答案为 -1 ,否则入度为 0 的点全部都为 A 就行了,第二天起床后果然没过,经过和队友的讨论后,发现漏掉了两个点:

  1. 不能只考虑正向拓扑,也得考虑反向拓扑,比如 3 2 3 1 3 2 这组数据
  2. 不能用 bfs 实现拓扑,要用 dfs 实现拓扑,因为 bfs 只能从入度为 0 的点开始拓扑,而我们需要按照变量的出现顺序进行拓扑,自然而然需要用 dfs 了,比如 3 2 1 2 1 3 这组数据

然后实现就行了,正向反向各写一个dfs用来拓扑

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;typedef long long LL;typedef unsigned long long ull;const LL inf=0x3f3f3f3f;const int N=2e5+100;vector<int>node1[N],node2[N];//正向边和反向边int c1[N],c2[N]; bool dfs1(int u)//正向拓扑
{c1[u]=-1;for(auto v:node1[u]){if(c1[v]<0)return false;else if(!c1[v]&&!dfs1(v))return false;}c1[u]=1;return true;
}bool dfs2(int u)//反向拓扑
{c2[u]=-1;for(auto v:node2[u]){if(c2[v]<0)return false;else if(!c2[v]&&!dfs2(v))return false;}c2[u]=1;return true;
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n,m;scanf("%d%d",&n,&m);while(m--){int u,v;scanf("%d%d",&u,&v);node1[u].push_back(v);node2[v].push_back(u);}int ans=0;string res;for(int i=1;i<=n;i++){if(!c1[i]&&!c2[i])//如果当前点还没有遍历过,也就是没有限制,则用A{ans++;res+="A";}else//有限制就用Eres+="E";if(!dfs1(i)||!dfs2(i))//拓扑找环return 0*puts("-1");}cout<<ans<<endl<<res<<endl;return 0;
}

CodeForces - 1345E Quantifier Question(dfs实现拓扑序)相关推荐

  1. CodeForces 1213F (强联通分量分解+拓扑排序)

    传送门 •题意 给你两个数组 p,q ,分别存放 1~n 的某个全排列: 让你根据这两个数组构造一个字符串 S,要求: (1)$\forall i \in [1,n-1],S_{pi}\leq S _ ...

  2. CF1385E Directing Edges 拓扑序

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

  3. #ACW 4084 号码牌(无向图连通性+简单拓扑序)

    1.题意 链接: 原题链接. 给你一个1~n全排列A,让你判断能否通过一种操作使之变为目标排列B.该操作是:交换与当前下标i相距did_idi​的2个元素. 如:下标为5,d5=2d_5=2d5​=2 ...

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

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

  5. AcWing 342. 道路与航线 (连通块Dijkstra+拓扑序||spfa+slf优化)

    整理的算法模板:ACM算法模板总结(分类详细版) 农夫约翰正在一个新的销售区域对他的牛奶销售方案进行调查. 他想把牛奶送到T个城镇,编号为1~T. 这些城镇之间通过R条道路 (编号为1到R) 和P条航 ...

  6. 解题报告:NOIP2013 车站分级(拓扑序递推求解差分约束、建图优化O(n+m)) 超详细讲解

    本题是2013年NOIP普及组的压轴题 差分约束裸题. 计算当前线路中最小的级别(比较始发站和终点站). 整条线路中所有大于这个级别的都必须停靠 所有未停靠的站点的级别一定小于这个级别 也就是说所有未 ...

  7. hdu3342 拓扑序

    题意:一个QQ群里面有一群大神,他们互相帮助解决问题,然后互相膜拜,于是有些人就称别人是他师父,现在给出很多师徒关系,问是否有矛盾 拓扑序,按师徒关系建边直接拓扑序就行了. 1 #include< ...

  8. BZOJ3832 [Poi2014]Rally 【拓扑序 + 堆】

    题目链接 BZOJ3832 题解 神思路orz,根本不会做 设\(f[i]\)为到\(i\)的最长路,\(g[i]\)为\(i\)出发的最长路,二者可以拓扑序后\(dp\)求得 那么一条边\((u,v ...

  9. Weights Assignment For Tree Edges 树,拓扑序(1500)

    题意 : 给定n个结点的树和序列bbb和ppp,bib_ibi​表示i结点的父节点,其中broot=rootb_{root}=rootbroot​=root,现在要给树上的每个边赋正权值,使得每个结点 ...

最新文章

  1. Udacity机器人软件工程师课程笔记(七)-ROS介绍和Turtlesim包的使用
  2. object转成实体对象_Object.assign 原理及其实现
  3. Django 入门项目案例开发(上)
  4. BizTalk开发系列(三十一)配置和使用HTTP适配器
  5. android 实现定时任务,Android 实现定时任务的过程详解
  6. 数据库设计与查询语句的优化
  7. 《leetcode : 647. 回文子串 思考分析双指针解法》
  8. 我如何将Google I / O 2018的兴奋带给尼日利亚沃里的115个人
  9. html没有插件怎么办,html网页包插件没有插入options.title
  10. mysql 去除重复 Select中DISTINCT关键字的用法(查询两列,只去掉重复的一列)
  11. 【MyBatis笔记】11-分步查询懒加载
  12. TCP三次握手与四次挥手的过程及原因
  13. Linux操作系统基本使用知识
  14. 环境配置之:pip 一步到位解决 pytorch-gpu 安装
  15. 统考计算机各题型分数,计算机等级考试分值
  16. 从一个面试官的角度谈谈产品经理怎么写简历
  17. 新加坡政府将与加美两国就网络安全问题展开合作
  18. Django用户认证系统
  19. pycharm更新pip提示Requirement already satisfied
  20. 学习笔记(2):Java面试:核心考点突击大串讲-Redis的持久化机制

热门文章

  1. c语言和java和汇编语言_C语言和汇编语言的区别是什么?
  2. ConcurrentHashMap的源码分析-CounterCells初始化图解
  3. 微信扫描登录(获取扫描人信息)
  4. es6语法-箭头函数
  5. 通过反射写一个通用的设置某个对象的某个属性为指定的值
  6. visualSVN下载与安装
  7. GraphQL入门之Schema和类型规范
  8. Zuul:路由和高可用小结
  9. 使用Commons Logging - Java异常处理
  10. 线程池 Executors2