题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1064

   给一个有向图染色,每个点的后继必须相同,问至少&至多有多少种染色方案

sol:  图由多个联通块组成,对于每个联通块,考虑以下3种情况:

   如果有环,分为3类讨论

     

     对于第一种简单环,答案一定是环长的约数

     对于第二种有反向边的环,答案一定是两条链长差的约数

       trick:将有向边化为无向边,正向边权为1,反向为-1

          这样1,2可以一起做

     对于第三种大环套小环,将小环缩点即可(gcd(a,b)=gcd(b,a-b))

     所以答案最大为所有环长的gcd,最小为gcd的约数中>3的最小的一个

   如果是一个森林

     

     则答案最大值为深度之差的最大值,最小值为3

   若最大值<3则无解

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. using namespace std;
  6. const int N=;
  7. const int M=;
  8. int n,m,tot,maxn,minn,ansmin,ansmax;
  9. int dis[N],head[N],vis[N],ver[M],nxt[M],edge[M];
  10. void add(int u,int v,int d)
  11. {
  12. tot++;
  13. nxt[tot]=head[u];
  14. ver[tot]=v;
  15. edge[tot]=d;
  16. head[u]=tot;
  17. }
  18. int gcd(int x,int y)
  19. {
  20. if(!y) return x;
  21. return gcd(y,x%y);
  22. }
  23. void dfs1(int x,int fa)//找环
  24. {
  25. vis[x]=;
  26. for(int i=head[x];i;i=nxt[i])
  27. {
  28. int v=ver[i];
  29. if(v!=fa)
  30. {
  31. if(!vis[v])vis[v]=,dis[v]=dis[x]+edge[i],dfs1(v,x);
  32. else ansmax=gcd(ansmax,abs(dis[x]-dis[v]+edge[i]));
  33. }
  34. }
  35. }
  36. void dfs2(int x,int fa)//处理森林
  37. {
  38. vis[x]=;
  39. maxn=max(dis[x],maxn);
  40. minn=min(minn,dis[x]);
  41. for(int i=head[x];i;i=nxt[i])
  42. {
  43. int v=ver[i];
  44. if(v!=fa)
  45. if(!vis[v])
  46. vis[v]=,dis[v]=dis[x]+edge[i],dfs2(v,x);
  47. }
  48. }
  49. int main()
  50. {
  51. scanf("%d%d",&n,&m);
  52. while(m--)
  53. {
  54. int a,b; scanf("%d%d",&a,&b);
  55. add(a,b,); add(b,a,-);
  56. }
  57. for(int i=;i<=n;i++) if(!vis[i]) dfs1(i,);
  58. if(ansmax) for(ansmin=;ansmin<=ansmax&&ansmax%ansmin;ansmin++);
  59. else
  60. {
  61. ansmin=;memset(vis,,sizeof(vis));
  62. for(int i=;i<=n;i++)
  63. if(!vis[i])
  64. {
  65. maxn=minn=,dis[i]=;
  66. dfs2(i,);ansmax+=maxn-minn+;
  67. }
  68. }
  69. if(ansmax<=) ansmax=ansmin=-;
  70. printf("%d %d\n",ansmax,ansmin);
  71. return ;
  72. }

bzoj 1064【noi2008】假面舞会的更多相关文章

  1. [bzoj 1064][NOI2008]假面舞会(dfs判断环)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1064 分析: 如果a看到b,则a->b 那么: 1.如果图中有环,则说明这个环的 ...

  2. [BZOJ]1064: [Noi2008]假面舞会

    题目大意:n个人,k种假面,每人戴一种,戴第i种的可以看见第i+1种,戴第k种的可以看见第1种,给出m条关系表示一个人可以看到另一个人,问k可能的最大值和最小值.(n<=100,000,m< ...

  3. BZOJ 1064: [Noi2008]假面舞会(dfs + 图论好题!)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1064 题意: 思路: 考虑以下几种情况: ①无环并且是树: 无环的话就是树结构了,树结构的话想一下就 ...

  4. bzoj 1064 noi2008 假面舞会题解

    莫名其妙的变成了我们的noip互测题... 其实这题思想还是比较简单的,只是分类不好分而已 其实就是一个dfs的事 首先,非常明显,原题目中的所有关系可以抽象成一个图(这是...显而易见的吧...) ...

  5. 【BZOJ】1064: [Noi2008]假面舞会(判环+gcd+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1064 表示想到某一种情况就不敢写下去了.... 就是找环的gcd...好可怕.. 于是膜拜了题解.. ...

  6. 1064: [Noi2008]假面舞会 - BZOJ

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

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

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

  8. NOI2008假面舞会

    1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 883  Solved: 462[Submit][Status] ...

  9. [BZOJ1064][Noi2008]假面舞会

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

  10. 【洛谷】1477:[NOI2008]假面舞会【图论】

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

随机推荐

  1. FocusWriter

    2. FocusWriter 如果你正在从事某种写作——小说.博客.文档等——你绝对希望认识一下FocusWriter.它已经有近十年的发布历史了,但是一直是我们最喜欢的无分心写作应用之一.如果你希望 ...

  2. python的常用概念

    常用的概念 主体字符串 主体列表 内置函数和方法的区别 映射表 引用 迭代器: 1. 字典:单步遍历迭代器 2. 文件:逐行读取的迭代器

  3. mysql 闪回表工具

    use HTTP::Date qw(time2iso str2time time2iso time2isoz); use POSIX; my $SDATE = strftime("%Y-%m ...

  4. 【HDOJ】4373 Mysterious For

    1. 题目描述有两种不同类型的循环,并给出一个由1.2组成的序列,表示嵌套的循环类型.问这样组着的循环一共需要多少次循环?并将结果模364875103. 2.基本思路显然,每当遇到一个类型1的序列,即 ...

  5. Ubuntu安装node.js

    通过PPA安装Node.js sudo apt-get install python-software-properties sudo add-apt-repository ppa:chris-lea ...

  6. Unity3D中使用3DMAX建模规范

    1.将3Dmax中的单位制设置为厘米.  如果使用3DMax来建模的话,可将3DMax的系统默认单位改成厘米 〉Customize - Units Setup - Metric - Display U ...

  7. UVa 753 (二分图最大匹配) A Plug for UNIX

    题意: 有n个插座,m个设备以及k种转化器(每种转化器视为有无限个). 转换器A->B可以将A类型的插头转化成B类型的插头,所以可以插在B类型的插座上. 求最少剩多少不匹配的设备. 分析: 抛开 ...

  8. HDU 4237 The Rascal Triangle

    The Rascal Triangle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  9. HTML DOM 教程Part1

    2015-05-08 摘自W3C School HTML DOM HTML DOM 定义了访问和操作HTML文档的标准方法.HTML DOM 把 HTML 文档呈现为带有元素.属性和文本的树结构(节点 ...

  10. Explain 结果解读与实践

    Explain 结果解读与实践 基于 MySQL 5.0.67 ,存储引擎 MyISAM . 注:单独一行的"%%"及"`"表示分隔内容,就象分开“第一章”“第 ...