假面舞会(codevs 1800)
一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会。 今年的面具都是主办方特别定制的。每个参加舞会的人都可以在入场时选择 一个自己喜欢的面具。每个面具都有一个编号,主办方会把此编号告诉拿该面具 的人。 为了使舞会更有神秘感,主办方把面具分为 k (k≥3)类,并使用特殊的技术将 每个面具的编号标在了面具上,只有戴第 i 类面具的人才能看到戴第 i+1 类面具 的人的编号,戴第 k 类面具的人能看到戴第 1 类面具的人的编号。 参加舞会的人并不知道有多少类面具,但是栋栋对此却特别好奇,他想自己 算出有多少类面具,于是他开始在人群中收集信息。 栋栋收集的信息都是戴第几号面具的人看到了第几号面具的编号。如戴第 2 号面具的人看到了第 5 号面具的编号。栋栋自己也会看到一些编号,他也会根据 自己的面具编号把信息补充进去。 由于并不是每个人都能记住自己所看到的全部编号,因此,栋栋收集的信息 不能保证其完整性。现在请你计算,按照栋栋目前得到的信息,至多和至少有多 少类面具。由于主办方已经声明了 k≥3,所以你必须将这条信息也考虑进去。
输入文件 party.in 第一行包含两个整数 n, m,用一个空格分隔,n 表示主办 方总共准备了多少个面具,m 表示栋栋收集了多少条信息。 接下来 m 行,每行为两个用空格分开的整数 a, b,表示戴第 a 号面具的人看 到了第 b 号面具的编号。相同的数对 a, b 在输入文件中可能出现多次。
输出文件 party.out 包含两个数,第一个数为最大可能的面具类数,第二个数 为最小可能的面具类数。如果无法将所有的面具分为至少 3 类,使得这些信息都 满足,则认为栋栋收集的信息有错误,输出两个-1。
【输入样例一】
6 5 1 2 2 3 3 4 4 1 3 5
【输入样例二】
3 3 1 2 2 1 2 3
【输出样例一】
4 4
【输出样例二】
-1 -1
50%的数据,满足 n ≤ 300, m ≤ 1000;
100%的数据,满足 n ≤ 100000, m ≤ 1000000。
/*
首先明确思路:当出现环时,所有环长度的最大公约数即为ansmax,
ansmin为ansmax的最小约数,没有环时,所有直链长度的和为ansmax,ansmin为3(ans>3)
做法:在建立变的同时,反向建立一条边权为-1的边。 我们要维护一个
时间戳,记录第一次搜到某个点的时间,当再次搜到这个点时,
深度-时间戳就是环长。
解释:例如a->b->c->d,a->e->d,虽然没有出现环,但会重复搜到d,
那么d的时间戳为3,此时“环长”为abs(2-3)=1。
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#define N 100010
#define M 1000010
using namespace std;
int head[N],dfn[N],vis[N],cnt,ansmax,ansmin,mx,mn;
struct node
{
int v,t,pre;
};node e[M];
int gcd(int a,int b)
{
if(!b)return a;
return gcd(b,a%b);
}
int read()
{
char c=getchar();int num=;
while(c<''||c>''){c=getchar();}
while(c>=''&&c<=''){num=num*+c-'';c=getchar();}
return num;
}
void add(int x,int y,int z)
{
e[++cnt].v=y;
e[cnt].t=z;
e[cnt].pre=head[x];
head[x]=cnt;
}
void dfs1(int x)
{
vis[x]=;
for(int i=head[x];i;i=e[i].pre)
if(!vis[e[i].v])
{
dfn[e[i].v]=dfn[x]+e[i].t;
dfs1(e[i].v);
}
else ansmax=gcd(ansmax,abs(dfn[x]+e[i].t-dfn[e[i].v]));
}
void dfs2(int x)
{
vis[x]=;
mx=max(mx,dfn[x]);
mn=min(mn,dfn[x]);
for(int i=head[x];i;i=e[i].pre)
if(!vis[e[i].v])
{
dfn[e[i].v]=dfn[x]+e[i].t;
dfs2(e[i].v);
}
}
int main()
{
int n=read(),m=read();
for(int i=;i<=m;i++)
{
int x=read(),y=read();
add(x,y,);add(y,x,-);
}
for(int i=;i<=n;i++)
if(!vis[i])
dfs1(i);
if(ansmax)
for(ansmin=;ansmin<ansmax&&ansmax%ansmin;ansmin++);
else
{
memset(dfn,,sizeof(dfn));
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++)
if(!vis[i])
{
mx=;mn=;
dfs2(i);
ansmax+=mx-mn+;
}
ansmin=;
}
if(ansmax<)printf("-1 -1");
else printf("%d %d",ansmax,ansmin);
return ;
}
假面舞会(codevs 1800)的更多相关文章
- Codevs 1800 假面舞会 2008年NOI全国竞赛
1800 假面舞会 2008年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 一年一度的假面舞会又开始了,栋栋也 ...
- BZOJ 1064 假面舞会(NOI2008) DFS判环
此题,回想Sunshinezff学长给我们出的模拟题,原题啊有木有!!此处吐槽Sunshinezff爷出题不人道!! 不过也感谢Sunshinezff学长的帮助,我才能做出来.. 1064: [Noi ...
- 图论 公约数 找环和链 BZOJ [NOI2008 假面舞会]
BZOJ 1064: [Noi2008]假面舞会 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1655 Solved: 798[Submit][S ...
- [BZOJ1064][Noi2008]假面舞会
[BZOJ1064][Noi2008]假面舞会 试题描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢 ...
- 1064: [Noi2008]假面舞会 - BZOJ
Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办 ...
- NOI2008假面舞会
1064: [Noi2008]假面舞会 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 883 Solved: 462[Submit][Status] ...
- [补档][NOI 2008]假面舞会
[NOI 2008]假面舞会 题目 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一个自己喜欢的面具. 每个面具都有一 ...
- 假面舞会[NOI2008]
题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号告 ...
- NOI 2008 假面舞会
题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会. 今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号 ...
随机推荐
- VCS 查看代码覆盖率
代码覆盖率 代码覆盖率测试一般包括行覆盖,条件覆盖,FSM覆盖,翻转覆盖率等.在不同的代码级别有不同的覆盖率,Behavioral code包含line+condition+path(branch)+ ...
- 管道命令和xargs的区别(经典解释) 自己的总结
1. 简介 之所以能用到这个命令,关键是由于很多命令不支 持|管道来传递参数,而日常工作中有有这个必要, 所以就有了xargs命令,例如:find /sbin -perm +700 |ls -l 这个 ...
- Mybatis(一)入门
mybatis使用的三个部分数据查询主体 : SqlSession查询映射层 : Mapper接口数据维护层 : Bean 设计一.添加maven依赖<!-- mybatis依赖 -->& ...
- git 本地与远程仓库出现代码冲突解决方法
提交过程中报错: [python@heaven-00 Selesystem]$ git push -u origin masterUsername for 'https://github.com': ...
- less算宽度 加~ width: calc(~"50% - 35px");
less算宽度 加~ width: calc(~"50% - 35px");
- tree iview treeData json数据 添加 selected 数据 要进行vue.set 进行响应式添加
tree iview treeData json数据 添加 selected 数据 要进行vue.set 进行响应式添加
- 利用CWinThread实现跨线程父子MFC窗口
利用CWinThread实现跨线程父子MFC窗口 MFC对象只能由创建该对象的线程访问,而不能由其他线程访问. 不遵守该准则将导致断言(assertion)或者无法预知的程序行为等运行期错误. 在多线 ...
- 解决aspnet上传文件大小限制
<system.web> <httpRuntime executionTimeout="600" maxRequestLength="20480& ...
- Node.js fs文件系统模块
一.读取文件几个步骤 1.先引入fs文件系统模块 2.使用readfile 或 readFileSync 注意点:它们的回调函数有两个参数,第一个是err,第二个是data,得到的data是buffe ...
- 用Multisim实现彩灯循环控制器
2019/06/06 !转载请注明出处 1.设计任务目的与要求 1.1 展示器件 10路彩灯分别用10个发光二极管L0.L1…..L9模拟,发光二极管L0.L1…..L9从左到右排列. 1.2 要求显 ...