7.9模拟赛T1图的遍历(dfs)
图的遍历(dfs)
【题目描述】
对于一个有向图G来说,我们存在一个经典的遍历算法,就是DFS (深度优先搜索遍历)。将G以1号点为起点进行DFS后,我们可以 得到G的一棵DFS遍历树T。就此,我们可以把G中的所有边分成4种 类型,如下: • 树边:边(u,v)满足是T上的边。 • 返祖边:边(u,v)满足在T上v是u的祖先。 • 前向边:边(u,v)满足在T上u是v的祖先,但不是父亲(即不是 树边)。 • 横叉边:除去以上所有情况的边就是横叉边。 现在我们给出四个整数A,B,C,D,要求构造图G,使得对G以1号点开 始进行DFS后,树边个数为A,返祖边个数为B,前向边个数为C,横 叉边个数为D。要求构造的G满足,联通(可以从1号点出发到达其他 所有点)、无重边、无自环,否则视为不合法。你只需要输出其中 任意一个解即可,我们会用spj判断你的解是否合法。
【输入格式】
仅一行,四个整数,表示 A,B,C,D。
【输出格式】
如果不存在解,输出-1。 如果有解,请现在第一行输出一个整数N,表示G的点数。 接下来N行,第i行先输出一个数Degreei,表示第i个点的出度; 接下来输出Degreei个数,描述i的所有出边。 注意不能存在重边和自环。 请注意,对于点i,在DFS过程中,我们会根据你输出的边的顺序, 依次进行拓展。
【样例输入】
3 1 1 1
【样例输出】
4
3 2 4 3
1 3
1 1
1 2
【数据范围】
本题一共 10 个测试点,每个测试点分值为 10 分。测试数据可分为 6 个部分,具体分值和说明如下: • 10% 的数据满足:0≤A,B,C,D≤5。 • 10% 的数据满足:D=0 • 10% 的数据满足:B=C=0。 • 20% 的数据满足:A≤100。 • 20% 的数据满足:A≤1000。 • 30% 的数据满足:A≤100000。 对于 100%的数据, 满足 0≤A,B,C,D≤100000。
sol:(题解)树边+前向边和返祖边数量是等价的,两者取最大即可称为 X 类 边,极端情况是链,共 N*(N-1)/2 条 但横叉边与上面俩是互斥的,称为 Y 类边,极端情况是菊花,共 (N-1)*(N-2)/2 条 考虑把菊花的一个叶子挪到某个叶子下面,发现 Y 类边少了一 条,X 类边多了一条。链类似 于是可以判断无解的情况,即 X 类边+Y 类边>N*(N-1)/2 yy 横叉边有点奇怪,考虑构造 X 类边刚好的方案,那么之后能 连得横叉边数量是最多的,一定满足 进一步观察,一个点能贡献 X 类边的数量之和它的深度有关,于 是直接先搞条链,最后一个点深度刚好卡好,接下来全都是深度为 1 的叶子即可 有其他构造方案的同学可以上来交流一下
自己yy的:说人话,应该已经知道链加菊花会是最优的,然后先在一条链上凑到max(A+C,B),剩下的搞成菊花
建边的时候dfs下去,注意一下顺序即可
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=;
int n,A,B,C,D,X,Y,Id[N],Top,Father[N],Lower[N];
//树边个数为A,返祖边个数为B,前向边个数为C,横叉边个数为D
vector<int>E[N],Ans[N];
inline void Link(int u,int v)
{
E[u].push_back(v); Ans[u].push_back(v);
}
inline void dfs(int u)
{
int i,j;
for(i=;i<=E[u].size();i++)
{
int v=E[u][i-];
Father[v]=u;
if(C)
{
for(j=Father[u];j&&C;j=Father[j])
{
Ans[j].push_back(v); C--; if(!C) break;
}
}
if(B)
{
for(j=u;j&&B;j=Father[j])
{
Ans[v].push_back(j); B--; if(!B) break;
}
}
if(D)
{
for(j=;j<=*Lower;j++)
{
Ans[v].push_back(Lower[j]); D--; if(!D) break;
}
}
dfs(v);
}
Lower[++*Lower]=u;
}
int main()
{
freopen("dfs.in","r",stdin);
freopen("dfs.out","w",stdout);
int i,j,Sum;
R(A); R(B); R(C); R(D);
Sum=X=max(B,A+C); Y=D; n=A+;
if((long long)(1LL*n*(n-)/)<(long long)(X+Y)) return puts("-1"),;
Id[Top=]=;
for(i=;i<=n;i++)
{
if(Sum>=Top++n-i)
{
Link(Id[Top++],i); Sum-=Top; Id[Top]=i;
}
else
{
int tmp=Sum-(n-i); Link(Id[tmp-],i); Sum-=tmp;
}
}
dfs();
Wl(n);
for(i=;i<=n;i++)
{
W((int)Ans[i].size());
for(j=;j<=Ans[i].size();j++) W(Ans[i][j-]);
putchar('\n');
}
return ;
}
/*
input
3 1 1 1
output
4
3 2 4 3
1 3
1 1
1 2
*/
7.9模拟赛T1图的遍历(dfs)的更多相关文章
- 5.20 省选模拟赛 T1 图 启发式合并 线段树合并 染色计数问题
LINK:图 在说这道题之前吐槽一下今天的日子 520 = 1+1+4+514. /cy 这道题今天做的非常失败 一点分都没拿到手 关键是今天的T3 把我整个人给搞崩了. 先考虑 如果得到了这么一张图 ...
- 图的遍历DFS
图的遍历DFS 与树的深度优先遍历之间的联系 树的深度优先遍历分为:先根,后根 //树的先根遍历 void PreOrder(TreeNode *R){ if(R!=NULL){ visit(R); ...
- 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解
今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...
- 20180610模拟赛T1——脱离地牢
Description 在一个神秘的国度里,年轻的王子Paris与美丽的公主Helen在一起过着幸福的生活.他们都随身带有一块带磁性的阴阳魔法石,身居地狱的魔王Satan早就想着得到这两块石头了,只要 ...
- 图的遍历——DFS(矩形空间)
首先,这里的图不是指的我们一般所说的图结构,而是大小为M*N的矩形区域(也可以看成是一个矩阵).而关于矩形区域的遍历问题经常出现,如“寻找矩阵中的路径”.“找到矩形区域的某个特殊点”等等之类的题目,在 ...
- 图的遍历——DFS和BFS模板(一般的图)
关于图的遍历,通常有深度优先搜索(DFS)和广度优先搜索(BFS),本文结合一般的图结构(邻接矩阵和邻接表),给出两种遍历算法的模板 1.深度优先搜索(DFS) #include<iostrea ...
- 图的遍历——DFS
原创 图的遍历有DFS和BFS两种,现选用DFS遍历图. 存储图用邻接矩阵,图有v个顶点,e条边,邻接矩阵就是一个VxV的矩阵: 若顶点1和顶点5之间有连线,则矩阵元素[1,5]置1,若是无向图[5, ...
- Java 第十一届 蓝桥杯 省模拟赛 小明植树(DFS)
小明植树 题目 问题描述 小明和朋友们一起去郊外植树,他们带了一些在自己实验室精心研究出的小树苗. 小明和朋友们一共有 n 个人,他们经过精心挑选,在一块空地上每个人挑选了一个适合植树的位置,总共 n ...
- [NOIP2018校模拟赛]T1 阶乘
题目: 描述 有n个正整数a[i],设它们乘积为p,你可以给p乘上一个正整数q,使p*q刚好为正整数m的阶乘,求m的最小值. 输入 共两行. 第一行一个正整数n. 第二行n个正整数a[i]. 输出 共 ...
随机推荐
- X86逆向4:VMP壳内寻找注册码
本节课将讲解一下重启验证,重启验证在软件中也是非常的常见的,重启验证的原理很简单,用户在注册界面输入注册码以后程序会自动将输入的注册信息保存到配置文件中,这里可能保存到注册表,也可能使用INI文件来保 ...
- 关闭钩子(shutdown hook)的作用以及在Tomcat中的使用
在很多实际应用环境中,当用户关了应用程序时,需要做一些善后清理工作,但问题是,用户有时并不会按照推荐的方法关闭应用程序,很有可能不做清理工作,例如在Tomcat的部署应用中,通过实例化一个Server ...
- 一次简单的springboot+dubbo+flume+kafka+storm+redis系统
最近无事学习一下,用springboot+dubbo+flume+kafka+storm+redis做了一个简单的scenic系统 scenicweb:展现层,springboot+dubbo sce ...
- 进阶Java编程(9)反射与类操作
1,反射获取类结构信息 在反射机制的处理过程之中不仅仅只是一个实例化对象的处理操作,更多的情况下还有类的组成结构操作,任何一个类的基本组成结构:父类(父接口).包.属性.方法(构造方法与普通方法). ...
- Facebook 一个热搜帖,美国一个老人癌症不治最后的心愿是跟儿子喝啤酒。
今天早上起床看到这个Facebook上的热搜帖.太感动了.这个老人癌症不治后最后心愿是跟他的儿子们一起喝一次啤酒.这个帖子被他孙子贴上网以后牵动了千万人的心.
- electron-vue在npm run build时报错 ⨯ cannot execute cause=fork/exec C:\Users\801\AppData\Local\electron-builder\Cache\winCodeSign\winCodeSign-2.5.0\rcedit-ia32.exe: Access is denied.
问题描述 在electron-vue执行npm run build时报错,错误如下: ⨯ cannot execute cause=fork/exec C:\Users\801\AppData\Loc ...
- vue-cli实现原理
分析:https://kuangpf.com/vue-cli-analysis/create/basic-verification.html vue-cli-service :https://blog ...
- 3 java 笔记
1 垃圾回收机制能够很好地提高编程效率 2 垃圾回机制保护程序的完成性 3 面向对象的三种基本特征:继承,封装,多态 4 面向对象的方式:OOA(面向对象的分析),OOD(面向对象的设计)和OOP(面 ...
- JavaWeb【七、JSP状态管理】
http协议无状态性 当提交请求,服务器返回响应.但当同一用户同一浏览器再次提交请求,服务器并不知道与刚才的请求是同一用户浏览器发起. 保存用户状态的两大机制 Session-保存在服务器端 Cook ...
- ubuntu版本信息查看
1.cat /etc/issue 2.cat /etc/lsb-release 3.uname -a 4.cat /proc/version 5.lsb_release -a 显卡信息1.lspci ...