ZOJ - 4124Median

  题目大意:有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的更多相关文章

  1. POJ 1270 Following Orders (拓扑排序,dfs枚举)

    题意:每组数据给出两行,第一行给出变量,第二行给出约束关系,每个约束包含两个变量x,y,表示x<y.    要求:当x<y时,x排在y前面.让你输出所有满足该约束的有序集. 思路:用拓扑排 ...

  2. 【紫书】Ordering Tasks UVA - 10305 拓扑排序:dfs到底再输出。

    题意:给你一些任务1~n,给你m个数对(u,v)代表做完u才能做v 让你给出一个做完这些任务的合理顺序. 题解:拓扑排序版题 dfs到底再压入栈. #define _CRT_SECURE_NO_WAR ...

  3. HDU 6073 Matching In Multiplication(拓扑排序+思维)

    http://acm.hdu.edu.cn/showproblem.php?pid=6073 题意:有个二分图,左边和右边的顶点数相同,左边的顶点每个顶点度数为2.现在有个屌丝理解错了最佳完美匹配,它 ...

  4. Toposort(拓扑排序)dfs递归模板

    最近刷了几题拓扑排序的题,记录一下拓扑排序 在有向图中,并且按照一定的规则(题目所给的规则)排序.如果图中出现了有向环的话就无法排序了. int gap[maxn][maxn];//记录下有向边 in ...

  5. CF思维联系--CodeForces -214C (拓扑排序+思维+贪心)

    ACM思维题训练集合 Furik and Rubik love playing computer games. Furik has recently found a new game that gre ...

  6. zoj 3524(拓扑排序+多重背包)(好题)

    http://blog.csdn.net/woshi250hua/article/details/7824773 题目大意:从前有n座山,山里都有一座庙,庙里都有一个老和尚,老和尚专送纪念品,每个纪念 ...

  7. luogu 3441 [POI2006]MET-Subway 拓扑排序+思维

    Description 给出一棵N个结点的树,选择L条路径,覆盖这些路径上的结点,使得被覆盖到的结点数最多. Input 第一行两个正整数N.L(2 <= N <= 1,000,000, ...

  8. 2019牛客暑期多校训练营(第五场)H-subsequence 2 (拓扑排序+思维)

    >传送门< 题意: 给你几组样例,给你两个字符a,b,一个长度len,一个长度为len的字符串str,str是字符串s的子串 str是s删掉除过a,b两字符剩下的子串,现在求s,多种情况输 ...

  9. 洛谷 P4017 最大食物链计数 (拓扑排序,思维)

    题意:有\(n\)个点,连\(m\)条边,求最多有多少条食物链(从头走到为有多少条路径). 题解:之前抽了点时间把拓扑排序补完了,这题其实就是一道拓扑排序的裸题.关于拓扑排序: ​ 1.首先,我们用\ ...

随机推荐

  1. Numpy学习之——数组创建

    Numpy学习之--数组创建 过程展示 import numpy as np a = np.array([2,3,9]) a array([2, 3, 9]) a.dtype dtype('int32 ...

  2. Web API 接口版本控制 SDammann.WebApi.Versioning

    前言 在设计对外 Web API 时,实务上可能会有新旧版本 API 并存的情况,例如开放 Web API 给厂商串接,但同一个服务更新版本时,不一定所有厂商可以在同一时间都跟着更新他们的系统,但如果 ...

  3. php对象转换为数组的部分代码

    function object_array($array){ if(is_object($array)){ $array = (array)$array; } if(is_array($array)) ...

  4. 在realm中动态查询用户的权限&角色

    @Controller @Scope("prototype") @Namespace("/") @ParentPackage("struts-defa ...

  5. JasperReport笔记

    参考: https://blog.csdn.net/dullchap/article/details/51799070 关于 ireport的初步使用 ,笔记记录

  6. 使用LaTeX和KnitR自动生成报告

    扩展名为.Rnw(Rtex)的文件就是包含了R代码的LaTeX文档.编译的时候,先用Rscript调用Knitr处理,生成.TeX文档,然后用pdfLaTeX/XeLaTeX编译成PDF. 最方便的编 ...

  7. 6.单表的CRUD操作

    1.插入后用新id初始化被插入对象 <insert id="insertStudentCatchId"> insert into student (age,name,s ...

  8. Rabbitmq各方法的作用详解

    exchange_declare('direct_logs', 'direct', false, false, false);// 这个是申明交换器,如果没有申明就给默认队列的这个交换器,而且发送的类 ...

  9. Notepad++快捷键及使用技巧

    常用快捷键: CTRL+Q 注释/取消注释 用Notepad++写代码,要是有一些重复的代码想copy一下,还真不容易,又得动用鼠标,巨烦人....有木有简单的方法呢,确实还是有的不过也不算太好用.主 ...

  10. HTML5学习:缩略图

    HTML代码 <div> <img src="img/pic.png" alt="This is a pic" /> </div& ...