1800 假面舞会 2008年NOI全国竞赛

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 大师 Master

题目描述 Description

一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会。 今年的面具都是主办方特别定制的。每个参加舞会的人都可以在入场时选择 一个自己喜欢的面具。每个面具都有一个编号,主办方会把此编号告诉拿该面具 的人。 为了使舞会更有神秘感,主办方把面具分为 k (k≥3)类,并使用特殊的技术将 每个面具的编号标在了面具上,只有戴第 i 类面具的人才能看到戴第 i+1 类面具 的人的编号,戴第 k 类面具的人能看到戴第 1 类面具的人的编号。 参加舞会的人并不知道有多少类面具,但是栋栋对此却特别好奇,他想自己 算出有多少类面具,于是他开始在人群中收集信息。 栋栋收集的信息都是戴第几号面具的人看到了第几号面具的编号。如戴第 2 号面具的人看到了第 5 号面具的编号。栋栋自己也会看到一些编号,他也会根据 自己的面具编号把信息补充进去。 由于并不是每个人都能记住自己所看到的全部编号,因此,栋栋收集的信息 不能保证其完整性。现在请你计算,按照栋栋目前得到的信息,至多和至少有多 少类面具。由于主办方已经声明了 k≥3,所以你必须将这条信息也考虑进去。

输入描述 Input Description

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

输出描述 Output Description

输出文件 party.out 包含两个数,第一个数为最大可能的面具类数,第二个数 为最小可能的面具类数。如果无法将所有的面具分为至少 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

数据范围及提示 Data Size & Hint

50%的数据,满足 n ≤ 300, m ≤ 1000;

100%的数据,满足 n ≤ 100000, m ≤ 1000000。

分类标签 Tags

大陆地区 NOI全国竞赛 2008年

/*
DFS 找环.
两次DFS 找最长链.
建边反向建-1避免无解情况判错.
ans不为0时(为0无环)ans为环长的gcd(大于3时).
ans为0时ans为树的最长链之和.
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#define MAXN 100001
#define MAXM 1000001*2
using namespace std;
int n,m,deep[MAXN],dfn[MAXN],tot,head[MAXN],ans,l,r;
bool b[MAXN];
struct data{
int v,next,x;
}e[MAXM];
int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
void add(int u,int v,int x){
e[++tot].v=v;
e[tot].next=head[u];
e[tot].x=x;
head[u]=tot;
}
int gcd(int a,int b){
if(!b)return a;gcd(b,a%b);
}
void dfs(int u){
dfn[u]=++tot;
for(int i=head[u];i;i=e[i].next){
if(dfn[e[i].v]){//只要搜到就成环.
ans=gcd(ans,abs(deep[u]+e[i].x-deep[e[i].v]));
}
else{
deep[e[i].v]=deep[u]+e[i].x;
dfs(e[i].v);
}
}
}
void dfs2(int u){
b[u]=true;
l=min(l,deep[u]),r=max(r,deep[u]);
for(int i=head[u];i;i=e[i].next){
if(!b[e[i].v]){
deep[e[i].v]=deep[u]+e[i].x;
dfs2(e[i].v);
}
}
}
void slove(){
tot=0;int lcm;
for(int i=1;i<=n;i++){
if(!dfn[i])
dfs(i);
}
if(ans){
lcm=3;
while(lcm<ans&&ans%lcm) lcm++;
}
else{
for(int i=1;i<=n;i++){
l=r=0;
if(!b[i]){
dfs2(i);
ans+=r-l+1;
}
}
lcm=3;
}
if(ans<3) ans=lcm=-1;
printf("%d %d",ans,lcm);
}
int main(){
int x,y;
n=read();m=read();
for(int i=1;i<=m;i++){
x=read();y=read();
add(x,y,1);add(y,x,-1);
}
slove();
return 0;
}

Codevs 1800 假面舞会 2008年NOI全国竞赛的更多相关文章

  1. 2008年NOI全国竞赛 假面舞会

    /* 分三种情况 1 有环:找环长的gcd作为max gcd的超过2的最小因子作为min 2 树:所有最长链的和作为max 3为min (最长链≥3) 3 两条相交链:找出所有的这样的两条链的差 同1 ...

  2. Codevs 1074 食物链 2001年NOI全国竞赛

    1074 食物链 2001年NOI全国竞赛 时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 动物王国中有三类动物 A,B ...

  3. 1729 单词查找树 2000年NOI全国竞赛

    1729 单词查找树 2000年NOI全国竞赛 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master         题目描述 Description 在进行文法分析的 ...

  4. 1074 食物链 2001年NOI全国竞赛

    1074 食物链 2001年NOI全国竞赛 时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond         题目描述 Description 动物王国中有三类动物 ...

  5. Codevs 1169 传纸条 2008年NOIP全国联赛提高组

    1169 传纸条 2008年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小渊和小轩是好朋友也是同班 ...

  6. CODEVS 1074 食物链 2001年NOI全国竞赛(洛谷 P2024)

    题目描述 Description 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A吃B,B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并 ...

  7. 食物链 2001年NOI全国竞赛

    时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond   题目描述 Description 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A吃B ...

  8. 1722 最优乘车 1997年NOI全国竞赛

    题目描述 Description H城是一个旅游胜地,每年都有成千上万的人前来观光.为方便游客,巴士公司在各个旅游景点及宾馆,饭店等地都设置了巴士站并开通了一些单程巴上线路.每条单程巴士线路从某个巴士 ...

  9. 银河英雄传说 2002年NOI全国竞赛

    时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年 ...

随机推荐

  1. centos "cannot open display"的问题

    实用技巧:在Linux下设置xhost方法步骤 第一步:用root登陆linux,启动vnc服务: 第二步:根据vnc起来的端口,设置export DISPLAY=localhost:1(1表示vnc ...

  2. Floyd-Warshall算法的理解

    Floyd算法可以求图内任意两点之间的最短路径,三重循环搞定,虽然暴力,但是属于算法当中最难的动态规划的一种,很有必要理解. 花了一晚上和半个下午专门看这个,才看个一知半解,智商被碾压没办法. 我一直 ...

  3. HW4.37

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  4. ZOJ3228 - Searching the String(AC自动机)

    题目大意 给定一个文本串,接下来有n个模式串,每次查询模式串出现的次数,查询分两种,可重叠和不可重叠 题解 第一次是把AC自动机构造好,跑n次,统计出每个模式串出现的次数,交上去果断TLE...后来想 ...

  5. Stream消息流 和 Stream Grouping 消息流组

  6. Hadoop概念学习系列之如何去找到历史版本的Hadoop发行包(三十四)

    如何去找到历史版本的Hadoop发行包 找到Hadoop历史版本 这里我需要的Hadoop版本是2.0.3.打开hadoop的下载页面 http://www.apache.org/dyn/closer ...

  7. 注册表-恶意首页追踪之旅(IE不能改主页)

    恶意首页追踪之旅(先说下,360无法修复这个恶意首页) 话说,今天下了个扫站的工具,结果一不小心中了恶意广告! 中招后不停的乱下东西安装,360不停的在那弹出提示! 无语了,一个个卸载,把C:\win ...

  8. A Tour of Go For

    Go has only one looping construct, the for loop. The basic for loop looks as it does in C or Java, e ...

  9. Android完美解决输入框EditText隐藏密码打勾显示密码问题

    长话短说,一共有两种方法.首先你需要在布局文件里面给EditText设置一个android:inputType="numberPassword"属性.我这里默认规定密码只能是数字了 ...

  10. progressBar 自定义

    自定义 ProgressBar 进度条 自定义样式[复制链接]     黑牛   黑牛当前离线 威望 33 在线时间 31 小时 金钱 443 贡献 10 诚信度 0 最后登录 2013-10-17 ...