莫名其妙的变成了我们的noip互测题...

其实这题思想还是比较简单的,只是分类不好分而已

其实就是一个dfs的事

首先,非常明显,原题目中的所有关系可以抽象成一个图(这是...显而易见的吧...)

接下来,我们仅需在图上讨论即可

当然,这个图有几个部分组成其实并没有那么重要,毕竟,这些部分基本是互不干扰的。

所以接下来我们只需要对每一个块分别处理即可

我们来分类:

首先,如果所有块都是树,我们只需求出每个树上的最长链即可

接下来,如果存在环(包括真实的环和类环,即1-2-3-1和1-2-4+1-3-4两种),那么种类数最多显然是所有

环大小的gcd(至于其他的树,可以完全不必考虑了)

于是问题就变成了怎么求环的大小

请大家注意一点,就是我们所说的环的大小是指的一个环中至多可以有几种面具

也就是说,对于一个这样的环:1-2-4和1-3-4,很显然2和3的编号应该是一样的,这样我们说这个类环的大小是3!

接下来我们讨论一下怎么求

其实求法很简单:化有向图为带权无向图!

即:如果这条边是正向的,我们把他的边权设为+1,反之设为-1

这样做的目的在于,还是以上面的图为例:1-2-4和1-3-4,我们双向建边就能求出环的大小(自己画一下,一下就出来)

剩下的部分就聊尽人事了

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
struct Edge
{
int next;
int to;
int val;
}edge[];
int head[];
int dep[];
int cnt=;
int d;
int n,m;
int maxdep,mindep=0x3f3f3f3f;
bool used[];
void init()
{
memset(head,-,sizeof(head));
cnt=;
}
int gcd(int x,int y)
{
if(y==)
{
return x;
}
return gcd(y,x%y);
}
void add(int l,int r,int w)
{
edge[cnt].next=head[l];
edge[cnt].to=r;
edge[cnt].val=w;
head[l]=cnt++;
}
void dfs(int x,int deep)
{
used[x]=;
dep[x]=deep;
maxdep=max(maxdep,dep[x]);
mindep=min(mindep,dep[x]);
for(int i=head[x];i!=-;i=edge[i].next)
{
int to=edge[i].to;
if(!used[to])
{
dfs(to,deep+edge[i].val);
}else
{
d=gcd(d,abs(deep+edge[i].val-dep[to]));
}
}
}
inline int read()
{
int f=,x=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int main()
{
// freopen("party.in","r",stdin);
// freopen("party.out","w",stdout);
n=read(),m=read();
init();
for(int i=;i<=m;i++)
{
int x=read(),y=read();
add(x,y,);
add(y,x,-);
}
int ret=;
for(int i=;i<=n;i++)
{
if(!used[i])
{
maxdep=;
mindep=0x3f3f3f3f;
dfs(i,);
ret+=maxdep-mindep+;
}
}
if(!d)
{
if(ret>=)
{
printf("%d 3\n",ret);
return ;
}else
{
printf("-1 -1\n");
return ;
}
}else
{
if(d<)
{
printf("-1 -1\n");
return ;
}
for(int i=;i<=d;i++)
{
if(d%i==)
{
printf("%d %d\n",d,i);
return ;
}
}
}
}

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]假面舞会(判环+gcd+特殊的技巧)

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

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

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

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

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

  7. NOI2008假面舞会

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

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

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

  9. 【BZOJ1064】[Noi2008]假面舞会 DFS树

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

随机推荐

  1. python---memcache使用操作

    import memcache mc = memcache.Client(['127.0.0.1:8081'],debug=True) mc.set("key","val ...

  2. IoC之Spring.Net在Mvc项目中的使用

    MVC中使用Spring.net 前面学习了使用Autofac来实现控制反转,这里简单记录Spring.Net实现IoC和DI的步骤 第一步:安装如下Nuget包 (Spring.Web.Mvc) i ...

  3. servlet 获取 post body 体用流读取为空的问题【转】

    引用自: http://www.zicheng.net/article/982028.htm 目前基于rest风格的很多API开始使用通过body data来传输来代替之前的key-value传输方式 ...

  4. Sqoop入门

    1 下载地址         http://archive.cloudera.com/cdh5/cdh/5/         版本 sqoop-1.4.6-cdh5.7.0         安装包   ...

  5. OO第三阶段总结

    软件形式化方法历史 形式化方法的研究高潮始于20世纪60年代后期,针对当时所谓"软件危机",人们提出种种解决方法,归纳起来有两类:一是采用工程方法来组织.管理软件的开发过程:二是深 ...

  6. 虚拟树研究-CheckBox初步判断只能在第一列

    //虚拟树研究-CheckBox初步判断只能在第一列 procedure TWindowsXPForm.XPTreeInitNode(Sender: TBaseVirtualTree; ParentN ...

  7. python - 自定制property/property的延时计算

    自定制prooerty: #模拟@property 实现将类的函数属性变成类属性: #定义描述符 class msf(): def __init__(self,obj): self.obj = obj ...

  8. Android中的Service:Binder,Messenger,AIDL

    http://blog.csdn.net/luoyanglizi/article/details/51594016 http://blog.csdn.net/luoyanglizi/article/d ...

  9. Java InputStream 、 InputStreamReader和BufferedReader

    https://blog.csdn.net/zgljl2012/article/details/47267609 在Java中,上述三个类经常用于处理数据流,下面介绍一下三个类的不同之处以及各自的用法 ...

  10. UML和模式应用3:迭代和进化式分析和设计案例研究

    1.前言 如何进行迭代和进化式分析和设计?将采用案例研究的方式贯穿始终.案例研究所包含的内容: UI元素 核心应用逻辑层 数据库访问 与外部软硬构件的协作 本章关于OOA/D主要介绍核心应用逻辑层 2 ...