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.首先,我们用\ ...
随机推荐
- python学习-1 编程语言的介绍
1.开发语言: 高级语言:Java.python.C#.PHP.Go.ruby.C++等等 低级语言:C.汇编语言 2.机器码和字节码 高级语言 ====>字节码 低级语言===>机器码 ...
- Java 同一个类的不同实例对象竟然可以相互访问各自的private成员
如题,在看String源码的某个函数时,发现了这个操作是被允许的,而且可以直接改变private字段(不是final按理是可以改变),这与之前的理解有点相背. 接下来试图整理下Google来的结论: ...
- WPf ObservableCollection异步调用问题
当ObservableCollection列表被UI线程占用时,如果在异步线程中调用ObservableCollection,会弹出以下异常: private void Button1_OnClick ...
- DIP原则
依赖倒置原则(Dependence Inversion Principle,DIP)的原始定义: 高层模块不应该依赖底层模块,两者都应该依赖其抽象: 抽象不应该依赖细节: 细节应该依赖抽象.
- LeetCode 腾讯精选50题-- 买卖股票的最佳时机 II
贪心算法: 具体的解题思路如下: II 的解题思路可以分为两部分, 1. 找到数组中差值较大的两个元素,计算差值. 2. 再步骤一最大的元素的之后,继续遍历,寻找差值最大的两个元素 可以得出的是,遍历 ...
- 【php设计模式】装饰器模式
装饰器模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能.其结构图如下: Component为统一接口,也是装饰类和被装饰类的基本类型. ConcreteComponent为具体实现类 ...
- JS笛卡尔积算法与多重数组笛卡尔积实现方法示例
js 笛卡尔积算法的实现代码,据对象或者数组生成笛卡尔积,并介绍了一个javascript多重数组笛卡尔积的例子,以及java实现笛卡尔积的算法与实例代码. 一.javascript笛卡尔积算法代码 ...
- 轮播图--使用原生js的轮播图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JAVA实现QQ聊天气泡
最近做了聊天气泡功能,为自己的聊天室美化了一下聊天效果: 先来看一下效果: 主要的思路是:以一个JTextPane作为显示的面板,然后自定义一个组件JBubble气泡组件来实现他的聊天气泡,然后通过J ...
- CentOS 6.10 系统安装
本章内容: CentOS 6.10 的安装 一.安装光盘,选择 Install or upgrade an existing system 二.选择 skip 跳过光盘检查 三.选择 Next 四.选 ...