题面

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:
6 5
1 2
2 3
3 4
4 1
3 5
样例2:
3 3
1 2
2 1
2 3

Sample Output

样例1:
4 4
样例2:
-1 -1

Hint

数据范围:
50%的数据,满足n ≤ 300, m ≤ 1000;
100%的数据,满足n ≤ 100000, m ≤ 1000000。 

题解

orz QT666
出题直接出这种原题。。
考场各种yy,搞出了70分。。。


不乱说了,回归正题。
归结一下题意:
给定一张图,每个点有一个编号1..k1..k
给定若干条边
边一定是从编号ii连向编号i+1i+1,
且编号KK连向编号11
求K的最大最小可能值

因为边是单向,其实,图一共就几种情况:
11.环
若干个节点首位相连,那么答案一定是当前环的长度的一个因数。
2.2.伪环
这个的处理和环是类似的,等下一起讲。
伪环的形式大概是:

1---->2---->3---->4------
|                       |
|                       ↓
----------------------->5

3.3.链
如果不存在环或者伪环,
那么,最大的KK值一定就是所有的链长之和
你可以想象为若干链,然后把链首位相连,然后从1开始编号


接下来考虑如何处理环和伪环
对于伪环,我们可以考虑是一个边向回走,
然后对应的编号再减少,
因此,存边的时候,正边边权为11,反边边权为−1-1
于是伪环也可以变成正环处理。


继续想,怎么计算答案,
因为最终的答案就是所有环的大小gcdgcd,
求环的大小就是一遍DFSDFS
而环的大小的求法也不难,
首先给每个节点依次记录从出发点开始的距离
如果当前点被第二次访问过,
那么,环的大小就是 |dis−dis′||dis-dis'|
而链的长度则是当前DFSDFS出的最大的距离减去最小的距离


问题差不多解决了,关于k≥3k≥3的限制分类讨论即可。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAX 110000
inline int read()
{int x=0,t=1;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=-1,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return x*t;
}
struct Line
{int v,next;
}e[MAX*20];
int h[MAX],cnt=0,n,m;
int M1,M2,M;
bool vis[MAX];
int ans=0,dfn[MAX];
inline void Add(int u,int v)
{e[cnt]=(Line){v,h[u]};h[u]=cnt++;
}
int gcd(int a,int b)
{return !a?b:gcd(b%a,a);
}
void DFS(int u,int w)
{dfn[u]=w;vis[u]=true;M1=min(M1,w);M2=max(M2,w);for(int i=h[u];i!=-1;i=e[i].next){int v=e[i].v,ww=w+((i&1)?-1:1);if(!vis[v]){DFS(v,ww);}elseans=gcd(ans,abs(dfn[v]-ww));}
}
int main()
{memset(h,-1,sizeof(h));n=read();m=read();for(int i=1;i<=m;++i){int u=read(),v=read();Add(u,v);Add(v,u);}for(int i=1;i<=n;++i)if(!vis[i]){DFS(i,0);M+=M2-M1+1;M2=M1=0;}if(ans>=3){printf("%d ",ans);for(int i=3;i<=ans;++i)if(ans%i==0){printf("%d\n",i);return 0;}}if(ans==0&&M>=3){printf("%d 3\n",M);return 0;}puts("-1 -1");return 0;
}

【NOI2008】假面舞会(图论,搜索)相关推荐

  1. 图论 公约数 找环和链 BZOJ [NOI2008 假面舞会]

    BZOJ 1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1655  Solved: 798 [Submit] ...

  2. 【做题记录】[NOI2008] 假面舞会—有向图上的环与最长链

    luogu 1477 [NOI2008] 假面舞会 容易发现: 如果图中没有环,那么面具种数一定是所有联通块内最长链之和,最少为 \(3\) . 如果有环,则面具种数一定是所有环的大小的最大公约数. ...

  3. bzoj 1064: [Noi2008]假面舞会(DFS)

    1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2240  Solved: 1083 [Submit][Sta ...

  4. [Noi2008]假面舞会(dfs判环)

    [Noi2008]假面舞会 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具 ...

  5. [BZOJ]1064 [NOI2008] 假面舞会 dfs判环

    1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2160  Solved: 1047 [Submit][Sta ...

  6. 【BZOJ1064】[Noi2008]假面舞会 DFS树

    [BZOJ1064][Noi2008]假面舞会 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择 ...

  7. 1064: [Noi2008]假面舞会

    1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1960  Solved: 941 [Submit][Stat ...

  8. 【图论 搜索】bzoj1064: [Noi2008]假面舞会

    做到最后发现还是读题比赛:不过还是很好的图论题的 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选 ...

  9. [NOI2008] 假面舞会

    题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会. 今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号告 ...

  10. [NOI2008]假面舞会

    日常题目描述: 题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会. 今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号, ...

最新文章

  1. Minkowski坐标管理
  2. java内存区域之程序计数器
  3. Grunt 常用插件
  4. java中三个基本框架_对于Java基础者应该如何理解Java中的三大框架!
  5. elasticsearch mongodb mysql_Elasticsearch 与 Mongodb 数据同步问题
  6. hint oracle qbname_从才oracle中找到所有列名为BANK_ACC,且BANK_ACC=000的项,并将BANK_ACC=000000的项修改为BANK_ACC=111...
  7. python(命令行提示符的实现、四位数能组成多少个互不相同重复三位数的实现)
  8. sort()函数——C++
  9. NumPy库---Axis理解
  10. 整合nagios+cacti遇到问题及解决办法
  11. 读论文:AlexNet
  12. 天堂2单机版服务器时间修改,如何制作最新L2J天堂2单机版源码服务端教程.doc
  13. word在任意页面添加页码
  14. python浪漫代码表白npy_python – Cython使用MemoryView时关于NPY_NO_DEPRECATED_API的Numpy警告...
  15. java中格林尼治时间的输出_Java中格林尼治时间和时间戳的相互转换
  16. 微信 客服消息 发送 微信会回调三次的问题
  17. vs2013编译ffmpeg之二十六 opus、shine
  18. Excel 查重小技巧,适用于office2003
  19. 关于Prim算法,自己的一些总结
  20. verilog并行数据转换为串行输出

热门文章

  1. javaScript获取昨天日期跟今天日期
  2. 简单几步实现网络音乐播放器(Qt版百度FM)
  3. 抖音xlog算法 bqq 以及各个参数的解释以及如何突破风控注册账号和点赞关注
  4. VC程序中Windows XP风格程序界面的实现
  5. 开发一款抓取Android系统Log的APP(logcat, kernel, Memory, cpu)
  6. 万方数据库高级索引方式
  7. SF图像滤镜/美颜/美妆算法详解与实战
  8. 刘克亚十二条营销铁律
  9. python基础学习06_if条件判断(多重判断、嵌套、三目运算)
  10. 理解色彩与相机内图像处理流程——流程详解