ZOJ 4124 拓扑排序+思维dfs
题目大意:有n个元素,给出m对a>b的关系,问哪个元素可能是第(n+1)/2个元素,可能的元素位置相应输出1,反之输出0
省赛都过去两周了,现在才补这题,这题感觉不难,可能那时脑子混了,题意也没理解清楚。根据题目很容易看出,这跟拓扑排序有关,不过拓扑排序的作用在于判断给出的关系是否矛盾,在找判断可能是第(n+1)/2个元素还主要是思维。
哪个元素可能是中间的(n+1)/2个元素呢,就是那些明确在它前面的元素(比它大的)的数目和在它后面的元素(比它小的)的数目都不大于(n-1)/2个的元素,因为剩下的不确定比它大还是比它小的元素可以任意补在它的前面或者后面。所以我们可以用个dfs来处理对任意节点来说明确在它前面的,还有后面的元素的数目。就对任意一个节点来说,比比它小的元素的还小的元素肯定是比它小的,所以具体操作就是,我们对每个元素x进行dfs,然后对每个可以推断出比它小的但没未标记的元素y都进行更新,也就是在x后面的元素++,然后y前面的元素++,最后标记x比y大。
详情见代码,因为边也不多,所以我直接用了vector没用前向星。
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int N=;
vector<int> vv[N];
bool big[N][N];//big[i][j]就标记i是否比j大
int du[N],vis[N],pre[N],back[N];
void init(int n)
{
for(int i=;i<=n;i++)
{
du[i]=;
vis[i]=;
pre[i]=back[i]=;
vv[i].clear();
for(int j=;j<=n;j++)
big[i][j]=false;
}
}
bool tp(int n)
{
queue<int> q;
for(int i=;i<=n;i++)
if(du[i]<=&&!vis[i])
{
vis[i]=;
q.push(i);
}
int sum=,x,y;
while(!q.empty())
{
x=q.front();
q.pop();
sum++;
for(int i=;i<vv[x].size();i++)
{
y=vv[x][i];
du[y]--;
if(du[y]<=&&!vis[y])
{
vis[y]=;
q.push(y);
}
}
}
return sum==n;
}
void dfs(int u,int f)
{
for(int i=;i<vv[u].size();i++)
{
int v=vv[u][i];
if(!big[f][v])//f>v但还未标记,可以进行更新
{
big[f][v]=true;
pre[v]++;//在v前面的元素数目++
back[f]++;//在f后面的元素数目--
dfs(v,f);
}
}
}
int main()
{
int t,n,m,u,v;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
init(n);
while(m--)
{
scanf("%d%d",&u,&v);
du[v]++;
vv[u].push_back(v);
}
if(!tp(n))//拓扑排序判给出的关系是否矛盾
{
for(int i=;i<=n;i++)
putchar('');
puts("");
}
else
{
for(int i=;i<=n;i++)
dfs(i,i);
for(int i=;i<=n;i++)
if(pre[i]<=(n-)/&&back[i]<=(n-)/)
putchar('');
else
putchar('');
puts("");
}
}
return ;
}
一层一层拓扑你的心
ZOJ 4124 拓扑排序+思维dfs的更多相关文章
- POJ 1270 Following Orders (拓扑排序,dfs枚举)
题意:每组数据给出两行,第一行给出变量,第二行给出约束关系,每个约束包含两个变量x,y,表示x<y. 要求:当x<y时,x排在y前面.让你输出所有满足该约束的有序集. 思路:用拓扑排 ...
- 【紫书】Ordering Tasks UVA - 10305 拓扑排序:dfs到底再输出。
题意:给你一些任务1~n,给你m个数对(u,v)代表做完u才能做v 让你给出一个做完这些任务的合理顺序. 题解:拓扑排序版题 dfs到底再压入栈. #define _CRT_SECURE_NO_WAR ...
- HDU 6073 Matching In Multiplication(拓扑排序+思维)
http://acm.hdu.edu.cn/showproblem.php?pid=6073 题意:有个二分图,左边和右边的顶点数相同,左边的顶点每个顶点度数为2.现在有个屌丝理解错了最佳完美匹配,它 ...
- Toposort(拓扑排序)dfs递归模板
最近刷了几题拓扑排序的题,记录一下拓扑排序 在有向图中,并且按照一定的规则(题目所给的规则)排序.如果图中出现了有向环的话就无法排序了. int gap[maxn][maxn];//记录下有向边 in ...
- CF思维联系--CodeForces -214C (拓扑排序+思维+贪心)
ACM思维题训练集合 Furik and Rubik love playing computer games. Furik has recently found a new game that gre ...
- zoj 3524(拓扑排序+多重背包)(好题)
http://blog.csdn.net/woshi250hua/article/details/7824773 题目大意:从前有n座山,山里都有一座庙,庙里都有一个老和尚,老和尚专送纪念品,每个纪念 ...
- luogu 3441 [POI2006]MET-Subway 拓扑排序+思维
Description 给出一棵N个结点的树,选择L条路径,覆盖这些路径上的结点,使得被覆盖到的结点数最多. Input 第一行两个正整数N.L(2 <= N <= 1,000,000, ...
- 2019牛客暑期多校训练营(第五场)H-subsequence 2 (拓扑排序+思维)
>传送门< 题意: 给你几组样例,给你两个字符a,b,一个长度len,一个长度为len的字符串str,str是字符串s的子串 str是s删掉除过a,b两字符剩下的子串,现在求s,多种情况输 ...
- 洛谷 P4017 最大食物链计数 (拓扑排序,思维)
题意:有\(n\)个点,连\(m\)条边,求最多有多少条食物链(从头走到为有多少条路径). 题解:之前抽了点时间把拓扑排序补完了,这题其实就是一道拓扑排序的裸题.关于拓扑排序: 1.首先,我们用\ ...
随机推荐
- 第9章:Python自动化管理
1.使用SSH协议访问远程服务器 SSH协议 OpenSSH协议 使用密钥登陆远程服务器 使用ssh-agent管理私钥 2.使用Polysh批量管理服务器 Polysh requires pytho ...
- java包装类的缓存机制(转)
出处: java包装类的缓存机制 java 包装类的缓存机制,是在Java 5中引入的一个有助于节省内存.提高性能的功能,只有在自动装箱时有效 Integer包装类 举个栗子: Integer a = ...
- MySQL 聚合函数(一)聚合(组合)函数概述
MySQL版本:5.7+ 本节介绍对值的集合进行操作的组合(聚合)函数.翻译自:Aggregate (GROUP BY) Function Descriptions 一.MySQL 5.7中的聚合函数 ...
- 正则表达式 第五篇:C# 正则表达式
原文:正则表达式 第五篇:C# 正则表达式 本文整理C#正则表达式的元字符,正则表达式是由字符构成的表达式,每个字符代表一个规则,表达式中的字符分为两种类型:普通字符和元字符.普通字符是指字面含义不变 ...
- [转载]PyTorch中permute的用法
[转载]PyTorch中permute的用法 来源:https://blog.csdn.net/york1996/article/details/81876886 permute(dims) 将ten ...
- 在QT中添加LIB的方法
注意:-L后面跟着的目录不能用空格,否则会出现读不到的情况. 例如win32下添加D:\app\my.lib 就 pro文件中 LIBS += -LD:\app\debug\ -lmy
- mybatis+Oracle 批量插入数据,有数据做更新操作
<!-- 批量添加 --> <insert id="batchAdd" parameterType="java.util.List"& ...
- Python之IDE工具下载安装及注册详解及创建项目
这篇文章很适合刚接触python语言的或者没有语言基础的同学参考: 目录: 一.IDE工具下载安装 二.IDE注册方法 三.使用IDE 开发工具使用创建项目 一.下载并安装, IntelliJ IDE ...
- Vue移动端焦点状态跳转页面,焦点和键盘不消失的问题
问题:input搜索,在移动端焦点状态跳转页面,焦点不失焦,还在跳转后的页面闪烁,且键盘不消失 //主动隐藏键盘 document.getElementById('inputSearch').blur ...
- Delphi Tobject类