Codevs 1800 假面舞会 2008年NOI全国竞赛
来源:互联网 发布:北京电脑软件技术培训 编辑:程序博客网 时间:2024/05/16 02:10
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*2using 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全国竞赛
- 【BZOJ 1064】【NOI 2008】假面舞会
- [codevs 1789] 最大获利(2006年NOI全国竞赛)
- 【CodeVS 1540】银河英雄传说 2002年NOI全国竞赛
- Codevs 1074 食物链 2001年NOI全国竞赛
- [NOI 2008]假面舞会(综合图论)
- [BZOJ 1064][NOI 2008]假面舞会(图论+BFS)
- [NOI][CODEVS]1540 银河英雄传说 2002年NOI全国竞赛 并查集
- 【codevs 1540】银河英雄传说2002年NOI全国竞赛(并查集)
- noi 2008 假面舞会 (bzoj 1064)
- noi 2008 假面舞会 (bzoj 1064)
- 假面舞会
- NOI2008 假面舞会party
- [BZOJ1064][Noi2008]假面舞会
- 【BZOJ1064】【NOI2008】假面舞会
- bzoj 1064 假面舞会
- [bzoj1064][NOI2008]假面舞会
- BZOJ1064: [Noi2008]假面舞会
- HandleThread的分析
- 分布式事务(一) 两阶段提交及JTA
- Picasso源码初步分析
- 自定义ScrollView实现弹性ScrollView
- Origin SuffixArray
- Codevs 1800 假面舞会 2008年NOI全国竞赛
- python3.5.2 mysql Exccel
- Intent的用法的总结
- 37-002-1 通过spring的OpenSessionInViewFilter解决jsp页面懒加载显示的问题
- Codevs 1814 最长链
- 5-002-1 完全卸载掉oracle
- Codevs 2843 拯救炜哥
- Hdu 4514 湫湫系列故事——设计风景线
- UGUI使用截图