[NOI2008]假面舞会(DFS)
Description
一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会。今年的面具都是主办方特别定制的。每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具。每个面具都有一个编号,主办方会把此编号告诉拿该面具的人。为了使舞会更有神秘感,主办方把面具分为k (k≥3)类,并使用特殊的技术将每个面具的编号标在了面具上,只有戴第i 类面具的人才能看到戴第i+1 类面具的人的编号,戴第k 类面具的人能看到戴第1 类面具的人的编号。 参加舞会的人并不知道有多少类面具,但是栋栋对此却特别好奇,他想自己算出有多少类面具,于是他开始在人群中收集信息。 栋栋收集的信息都是戴第几号面具的人看到了第几号面具的编号。如戴第2号面具的人看到了第5 号面具的编号。栋栋自己也会看到一些编号,他也会根据自己的面具编号把信息补充进去。由于并不是每个人都能记住自己所看到的全部编号,因此,栋栋收集的信 息不能保证其完整性。现在请你计算,按照栋栋目前得到的信息,至多和至少有多少类面具。由于主办方已经声明了k≥3,所以你必须将这条信息也考虑进去。
Input
第一行包含两个整数n, m,用一个空格分隔,n 表示主办方总共准备了多少个面具,m 表示栋栋收集了多少条信息。接下来m 行,每行为两个用空格分开的整数a, b,表示戴第a 号面具的人看到了第b 号面具的编号。相同的数对a, b 在输入文件中可能出现多次。
Output
包含两个数,第一个数为最大可能的面具类数,第二个数为最小可能的面具类数。如果无法将所有的面具分为至少3 类,使得这些信息都满足,则认为栋栋收集的信息有错误,输出两个-1。
Sample Input
【输入样例一】
1 2
2 3
3 4
4 1
3 5
【输入样例二】
3 3
1 2
2 1
2 3
Sample Output
4 4
【输出样例二】
-1 -1
解题思路:
原谅我过于蒟蒻。
这道题就是一个深搜。
问题就在于,如果这个图是完整的,也就是说没有残缺,那么一定整体上是一个大环。
我们称之为骨架。
我们的任务就是找出这个骨架的长度。
那么比较好办的是如果给你一条链,那么可能的答案就是3~链长的所有解。
如果给你一个环,那么答案就是所有环长约数的环。
弄清楚这个以后,我们就可以找环了。
首先,化有向变无向,出始深度为0,反边权为-1。
对于无向图建dfs树,如果存在环的话直接更新答案。
在dfs的过程中记录出现的最大和最小深度。
用三个变量来存。
链长即max-min+1
最后讨论一下是否有环即可。
代码:
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using std::min;
- using std::max;
- using std::sort;
- using std::abs;
- void ade(int f,int t,int v);
- struct ed{
- int f;
- int t;
- void Insert(void)
- {
- scanf("%d%d",&f,&t);
- return ;
- }
- void add(void)
- {
- ade(f,t,);
- ade(t,f,-);
- return ;
- }
- bool friend operator != (ed x,ed y)
- {
- return (x.f!=y.f)||(x.t!=y.t);
- }
- }edde[];
- struct pnt{
- int hd;
- int dp;
- bool vis;
- }p[];
- struct ent{
- int twd;
- int lst;
- int vls;
- }e[];
- int cnt;
- int n,m;
- int ansmin,ansmax;
- int cha;
- int Uns;
- void ade(int f,int t,int v)
- {
- cnt++;
- e[cnt].twd=t;
- e[cnt].lst=p[f].hd;
- e[cnt].vls=v;
- p[f].hd=cnt;
- }
- bool cmp(ed x,ed y)
- {
- if(x.f==y.f)
- return x.t<y.t;
- return x.f<y.f;
- }
- int gcd(int x,int y)
- {
- return (!y)?x:gcd(y,x%y);
- }
- void dfs(int x,int dep)
- {
- p[x].vis=true;
- p[x].dp=dep;
- ansmin=min(ansmin,dep);
- ansmax=max(ansmax,dep);
- for(int i=p[x].hd;i;i=e[i].lst)
- {
- int to=e[i].twd;
- if(p[to].vis)
- {
- Uns=gcd(abs(p[to].dp-dep-e[i].vls),Uns);
- }else{
- dfs(to,dep+e[i].vls);
- }
- }
- return ;
- }
- int main(void)
- {
- scanf("%d%d",&n,&m);
- for(int i=;i<=m;i++)
- edde[i].Insert();
- sort(edde+,edde+m+,cmp);
- edde[].add();
- for(int i=;i<=m;i++)
- if(edde[i]!=edde[i-])
- edde[i].add();
- for(int i=;i<=n;i++)
- {
- if(!p[i].vis)
- {
- ansmax=ansmin=;
- dfs(i,);
- cha+=ansmax-ansmin+;
- }
- }
- if(Uns>=)
- {
- for(int i=;i<=Uns;i++)
- {
- if(Uns%i==)
- {
- printf("%d %d\n",Uns,i);
- return ;
- }
- }
- printf("%d %d",Uns,Uns);
- }else{
- if(Uns==&&cha>=)
- {
- printf("%d %d\n",cha,);
- return ;
- }
- printf("-1 -1\n");
- }
- return ;
- }
[NOI2008]假面舞会(DFS)的更多相关文章
- 【BZOJ1064】[Noi2008]假面舞会 DFS树
[BZOJ1064][Noi2008]假面舞会 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择 ...
- [bzoj 1064][NOI2008]假面舞会(dfs判断环)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1064 分析: 如果a看到b,则a->b 那么: 1.如果图中有环,则说明这个环的 ...
- 图论 公约数 找环和链 BZOJ [NOI2008 假面舞会]
BZOJ 1064: [Noi2008]假面舞会 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1655 Solved: 798[Submit][S ...
- [BZOJ1064][Noi2008]假面舞会
[BZOJ1064][Noi2008]假面舞会 试题描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢 ...
- NOI2008假面舞会
1064: [Noi2008]假面舞会 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 883 Solved: 462[Submit][Status] ...
- 【洛谷】1477:[NOI2008]假面舞会【图论】
P1477 [NOI2008]假面舞会 题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会. 今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具 ...
- 【做题记录】[NOI2008] 假面舞会—有向图上的环与最长链
luogu 1477 [NOI2008] 假面舞会 容易发现: 如果图中没有环,那么面具种数一定是所有联通块内最长链之和,最少为 \(3\) . 如果有环,则面具种数一定是所有环的大小的最大公约数. ...
- BZOJ1064 [Noi2008]假面舞会 【dfs】
题目 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号告诉拿 ...
- 1064: [Noi2008]假面舞会 - BZOJ
Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办 ...
随机推荐
- Hive Cilent数据操作
Hive运行命令方式有cli,jdbc.hwi.beeline.而我们经常使用的往往是cli shell 操作. cli shell hive -help hive --help 注:命令脚本必须在集 ...
- 一个美丽的java烟花程序
<img src="http://img.blog.csdn.net/20150625104525974?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi ...
- LSTM入门学习——本质上就是比RNN的隐藏层公式稍微复杂了一点点而已
LSTM入门学习 摘自:http://blog.csdn.net/hjimce/article/details/51234311 下面先给出LSTM的网络结构图: 看到网络结构图好像很复杂的样子,其实 ...
- Linux VNC客户端软件VNC Viewer | RealVNC
Linux很多时候是作为服务器操作系统,如果是桌面系统通常情况会远程管理linux服务器,很多时候通过VNC进行远程管理,这个时候就要在客户端安装VNC客户端软件,VNC Viewer | RealV ...
- JS对象继承与原型链
1.以复制方式实现的继承 1.1浅拷贝 基本类型的复制 var parent = { lanage: "chinese" } var child = { name: "x ...
- modelForm所遇问题
1. 通过modelForm创建表单所遇问题 id 在modelForm中无法创建使用 因为它是django的设置,自增的字段,而不是模型中所设置的字段. 当关联外键时,创建多选的下拉框时,需要注意此 ...
- [Python] Understand List Comprehensions in Python
List comprehensions provide a concise way to create new lists, where each item is the result of an o ...
- UNIX多线程编程
一个程序至少有一个进程.一个进程至少有一个线程.进程拥有自己独立的存储空间,而线程能够看作是轻量级的进程,共享进程内的全部资源.能够把进程看作一个工厂.线程看作工厂内的各个车间,每一个车间共享整个工厂 ...
- P2P进入整顿期,平衡风险和收益之间的矛盾是关键
毫无疑问,P2P网贷进入了其诞生以来最为关键的整顿期,随着大量提现困难.跑路的P2P平台被曝光之后.行业对P2P网贷的发展也多了几分慎重.少了几分浮躁.只是,P2P网贷所面临的问题正是其它不论 ...
- occActiveX - ActiveX with OpenCASCADE
occActiveX - ActiveX with OpenCASCADE eryar@163.com Abstract. OpenCASCADE ActiveX wrapper for VB, C# ...