题目描述

一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会。

今年的面具都是主办方特别定制的。每个参加舞会的人都可以在入场时选择一个自己喜欢的面具。每个面具都有一个编号,主办方会把此编号告诉拿该面具的人。

为了使舞会更有神秘感,主办方把面具分为 k(k≥3)类,并使用特殊的技术将每个面具的编号标在了面具上,只有戴第i类面具的人才能看到戴第i+1 类面具的人的编号,戴第k类面具的人能看到戴第1类面具的人的编号。

参加舞会的人并不知道有多少类面具,但是栋栋对此却特别好奇,他想自己算出有多少类面具,于是他开始在人群中收集信息。

栋栋收集的信息都是戴第几号面具的人看到了第几号面具的编号。如戴第2号面具的人看到了第5号面具的编号。栋栋自己也会看到一些编号,他也会根据自己的面具编号把信息补充进去。

由于并不是每个人都能记住自己所看到的全部编号,因此,栋栋收集的信息不能保证其完整性。现在请你计算,按照栋栋目前得到的信息,至多和至少有多少类面具。由于主办方已经声明了k≥3,所以你必须将这条信息也考虑进去。

输入格式

第一行包含两个整数 n,m,用一个空格分隔,n 表示主办方总共准备了多少个面具,m 表示栋栋收集了多少条信息。接下来 m 行,每行为两个用空格分开的整数 a,b,表示戴第 a 号面具的人看到了第b号面具的编号。相同的数对 a,b 在输入文件中可能出现多次。

输出格式

包含两个数,第一个数为最大可能的面具类数,第二个数为最小可能的面具类数。如果无法将所有的面具分为至少3 类,使得这些信息都满足,则认为栋栋收集的信息有错误,输出两个 -1

输入输出样例

输入 #1复制

6 5
1 2
2 3
3 4
4 1
3 5

输出 #1

4 4

输入 #2

3 3
1 2
2 1
2 3

输出 #2复制

-1 -1

说明/提示

  • 对于 50\%50% 的数据,满足 
  • 对于 100% 的数据,满足

实现

如果整个图没有环,且不存在两条共用起点和终点的相交链,显然最多能分的种类数是每个连通分量内最长链的长度之和。

如果整个图是由若干个不相交的环构成的话,最多能分的种类数是所有环长度的最大公约数(找环的时候,可以从连通块内的任意一点开始编号,第二次经过一个点的时候,它第二次的编号减去第一次的编号就是环的大小)。

除了这两种特殊情况之外,还有两种情况:

  1. 两个环之间有公共部分(指至少共用两个点)。
  2. 存在两个链共用起点和终点。

对于情况 1,合法的面具数一定是这两个环长度的公约数。

对于情况 2,合法的面具数一定是两个链长度差的约数。

我们将每个部分的结果合并,最后就可以得到整个图的结果。

先处理情况 1。我们考虑倒推:建图的时候不仅连一条u→v,边权为1 的边之外,同时连一条v→u,边权为 −1 的边(这种连边方式可以确保我们从任意一个点开始,都可以遍历整个连通块)。

对于每个连通块,我们还是任意选一个点开始编号,经过一条边的时候将编号加上边权,和上面一样,第二次经过同一个点的时候,它第二次的编号减去第一次的编号就是环的大小。

接下来处理情况 2。我们发现,上面的建图方式已经很好地处理了这种情况(走反边的时候权值 -1,刚好可以得到两条链长度的差值),因此不需要再另外进行处理。

(最后别忘了题目要求面具最少要有三种)

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#define INF 1e9
using namespace std;
struct edge {int v, w;bool operator<(const edge& a) const {return v < a.v || (v == a.v && w < a.w);}
};
vector<edge> e[100005];
int dis[100005], vis[100005], ans, res, cnt, maxv, minv;
int gcd(int x, int y) { return y == 0 ? x : gcd(y, x % y); }
void dfs(int u, int d) {if (dis[u]) {ans = gcd(ans, abs(d - dis[u]));return;}dis[u] = d, vis[u] = 1;maxv = max(maxv, dis[u]);minv = min(minv, dis[u]);for (auto i : e[u]) dfs(i.v, d + i.w);
}
int main() {int n, m;scanf("%d%d", &n, &m);for (int i = 1; i <= m; i++) {int u, v;scanf("%d%d", &u, &v);e[u].push_back({v, 1});e[v].push_back({u, -1});}for (int i = 1; i <= n; i++)if (!vis[i]) {maxv = -INF, minv = INF;dfs(i, 1);res += maxv - minv + 1;}if (ans) {if (ans < 3)puts("-1 -1");elsefor (int i = 3; i <= ans; i++)if (ans % i == 0) {printf("%d %d\n", ans, i);break;}} else {if (res < 3)puts("-1 -1");elseprintf("%d 3\n", res);}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]假面舞会

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

最新文章

  1. Windows 7的CMD中 Telnet 无法执行的解决办法
  2. 如何在 Xcode 中修改应用的名字
  3. 解决VC6中error LNK2001 _WinMain@16错误
  4. C++Eratosthenes埃氏筛法获取素数列表的实现算法(附完整源码)
  5. python文档的查看-python文件信息查看和修改
  6. 如何构建分布式SFU/MCU媒体服务器?
  7. 普通二本的辛酸Android面试之路,算法太TM重要了
  8. 2015-05-31
  9. 使用python game写一个贪吃蛇游戏
  10. Vue父子组件生命周期
  11. 大话数据结构 -04-3 队列
  12. MDaemon替换注册码怎样人工激活.docx
  13. bootstrap 3.0 LESS源代码浅析(一)
  14. Cloudera Hadoop 4 实战课程(Hadoop 2.0、集群界面化管理、电商在线查询+日志离线分析)...
  15. Coder Essential之编程语言学习知识点纲要
  16. 计算机软件uml,[计算机软件及应用]UML.ppt
  17. b和kb的换算_b和kb的换算(b换算成kb)
  18. metabase table 类型entity_type 识别
  19. w ndows无法连接到System,电脑无法连接到System Event Notification Service服务
  20. 如何在MSDN上下载操作系统

热门文章

  1. canal 重启后不同步数据
  2. (转)马邑之战与项目管理
  3. HDMI 数据包简析
  4. Springboot2.x使用feign自定义Decoder,Advice
  5. 基于Arduino的显示测量环境数据设计
  6. 82540em 无盘服务器,千兆网卡
  7. rpc服务器不可用桌面图标消失,rpc服务器不可用,教您rpc服务器不可用怎么办
  8. mysql 5.6.24 64位_CentOS 6.4 64位 安装 mysql 5.6.24
  9. get请求在ie浏览器中缓存问题
  10. 寒湿重的表现 ,舌苔发白