博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[NOI2008]假面舞会(DFS)
阅读量:4596 次
发布时间:2019-06-09

本文共 2614 字,大约阅读时间需要 8 分钟。

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

【输入样例一】

6 5
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

最后讨论一下是否有环即可。

代码:

1 #include
2 #include
3 #include
4 using std::min; 5 using std::max; 6 using std::sort; 7 using std::abs; 8 void ade(int f,int t,int v); 9 struct ed{ 10 int f; 11 int t; 12 void Insert(void) 13 { 14 scanf("%d%d",&f,&t); 15 return ; 16 } 17 void add(void) 18 { 19 ade(f,t,1); 20 ade(t,f,-1); 21 return ; 22 } 23 bool friend operator != (ed x,ed y) 24 { 25 return (x.f!=y.f)||(x.t!=y.t); 26 } 27 }edde[1000005]; 28 struct pnt{ 29 int hd; 30 int dp; 31 bool vis; 32 }p[500000]; 33 struct ent{ 34 int twd; 35 int lst; 36 int vls; 37 }e[3000000]; 38 int cnt; 39 int n,m; 40 int ansmin,ansmax; 41 int cha; 42 int Uns; 43 void ade(int f,int t,int v) 44 { 45 cnt++; 46 e[cnt].twd=t; 47 e[cnt].lst=p[f].hd; 48 e[cnt].vls=v; 49 p[f].hd=cnt; 50 } 51 bool cmp(ed x,ed y) 52 { 53 if(x.f==y.f) 54 return x.t
=3) 99 {100 for(int i=3;i<=Uns;i++)101 {102 if(Uns%i==0)103 {104 printf("%d %d\n",Uns,i);105 return 0;106 }107 }108 printf("%d %d",Uns,Uns);109 }else{110 if(Uns==0&&cha>=3)111 {112 printf("%d %d\n",cha,3);113 return 0;114 }115 printf("-1 -1\n");116 }117 return 0;118 }

 

转载于:https://www.cnblogs.com/blog-Dr-J/p/9624730.html

你可能感兴趣的文章
ansible基础-Jinja2模版 | 测试
查看>>
数字图像处理实验(5):PROJECT 04-01 [Multiple Uses],Two-Dimensional Fast Fourier Transform ...
查看>>
sqlite3:深入理解sqlite3_stmt 机制
查看>>
一个注释版的查取列表信息
查看>>
使用Ctex总结1
查看>>
ios关闭自动更新
查看>>
10 款非常棒的CSS代码格式化工具推荐
查看>>
【BZOJ2298】[HAOI2011]problem a
查看>>
【转】关于Jmeter3.0,你必须要知道的5点变化
查看>>
OJ使用心得
查看>>
day6_time模块和datetime模块
查看>>
AppUi自动化框架tool.py代码
查看>>
Oracle物理文件分类:
查看>>
请别随意关闭默认共享
查看>>
Linux CentOS中防火墙的关闭及开启端口
查看>>
机器学习中的数学(1)-回归(regression)、梯度下降(gradient descent)
查看>>
网页性能优化
查看>>
destoon网站转移空间教程
查看>>
.Net 三款工作流引擎比较:WWF、netBPM 和 ccflow
查看>>
P1280 尼克的任务(DP)
查看>>