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. 对Python中print函数参数的认识

    输出函数是最常用的,对print()参数的准确认识尤为重要. sep='':sep参数表示函数中不同value的分隔符,默认为一个空格. end='':end参数表示函数结尾的处理,默认换行. 例如: ...

  2. centos7 + postgresql10

    mysql被黑惨了,换了个超复杂的密码都不行,黑客会删除你所有的自定义库,然后插一个warning表,让你给他汇比特币. 提醒大家放在在公网的DB,要非常注意数据的安全性,万一被勒索了,真是mmp了. ...

  3. MyEclipse10.0 采用插件方式安装 SVN

    一.到官方上下载svn1.8.3,下载后的文件名叫site-1.8.3.zip 地址:http://subclipse.tigris.org/servlets/ProjectDocumentList? ...

  4. sketch最强切图工具Sketch Measure

    https://www.inpandora.com/sketch-measure.html https://www.jianshu.com/p/c11ae88e6b1d

  5. 13 Msql之四种事务隔离界别

    一.事务的基本要素 1.原子性:事务开始后的所有操作,要么全部做完,要么全部不做,不能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没发生一样.也就是说事务是一个不可分割 ...

  6. 有趣的"=="与"==="

    console.log([]==![]);//true //"=="会进行类型转换,转换成统一类型进行比较 // !符号优于==,[]boolean值为TRUE,所以![]就是FA ...

  7. MUI 跨域请求web api

    由于刚接触MUI框架,所以在跨域问题上花了一点时间.希望我的方式能帮你少走点弯路(大神就直接过里吧)! 首先,遇到这个问题,各种百度.其中说法最多的是将mui,js文件里的 setHeader('X- ...

  8. BigDecimal与Long、int之间的相互转换

    //bigDecimal 转换成 Long类型 public static Long bigDecimalToLong(BigDecimal b){ BigDecimal c = new BigDec ...

  9. Lab2 Report

    1.安装SeleniumIDE插件 a)安装Firefox 17.0 - 56.*版本的firefox,下载地址为:http://ftp.mozilla.org/pub/firefox/release ...

  10. Windows下解决系统端口被VM虚拟机占用问题

    一)问题背景 安装VM虚拟机后,经常会遇到启动其他程序时出现端口被占用的情况,其中以80端口被占用最为常见. 二)解决思路 解除或更改被占用端口号,但是更改端口号时,除非对系统的端口占用情况非常熟悉, ...