bzoj 1064 noi2008 假面舞会题解
莫名其妙的变成了我们的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 假面舞会题解的更多相关文章
- [bzoj 1064][NOI2008]假面舞会(dfs判断环)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1064 分析: 如果a看到b,则a->b 那么: 1.如果图中有环,则说明这个环的 ...
- [BZOJ]1064: [Noi2008]假面舞会
题目大意:n个人,k种假面,每人戴一种,戴第i种的可以看见第i+1种,戴第k种的可以看见第1种,给出m条关系表示一个人可以看到另一个人,问k可能的最大值和最小值.(n<=100,000,m< ...
- BZOJ 1064: [Noi2008]假面舞会(dfs + 图论好题!)
http://www.lydsy.com/JudgeOnline/problem.php?id=1064 题意: 思路: 考虑以下几种情况: ①无环并且是树: 无环的话就是树结构了,树结构的话想一下就 ...
- 【BZOJ】1064: [Noi2008]假面舞会(判环+gcd+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1064 表示想到某一种情况就不敢写下去了.... 就是找环的gcd...好可怕.. 于是膜拜了题解.. ...
- 1064: [Noi2008]假面舞会 - BZOJ
Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办 ...
- 图论 公约数 找环和链 BZOJ [NOI2008 假面舞会]
BZOJ 1064: [Noi2008]假面舞会 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1655 Solved: 798[Submit][S ...
- NOI2008假面舞会
1064: [Noi2008]假面舞会 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 883 Solved: 462[Submit][Status] ...
- [BZOJ1064][Noi2008]假面舞会
[BZOJ1064][Noi2008]假面舞会 试题描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢 ...
- 【BZOJ1064】[Noi2008]假面舞会 DFS树
[BZOJ1064][Noi2008]假面舞会 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择 ...
随机推荐
- python---memcache使用操作
import memcache mc = memcache.Client(['127.0.0.1:8081'],debug=True) mc.set("key","val ...
- IoC之Spring.Net在Mvc项目中的使用
MVC中使用Spring.net 前面学习了使用Autofac来实现控制反转,这里简单记录Spring.Net实现IoC和DI的步骤 第一步:安装如下Nuget包 (Spring.Web.Mvc) i ...
- servlet 获取 post body 体用流读取为空的问题【转】
引用自: http://www.zicheng.net/article/982028.htm 目前基于rest风格的很多API开始使用通过body data来传输来代替之前的key-value传输方式 ...
- Sqoop入门
1 下载地址 http://archive.cloudera.com/cdh5/cdh/5/ 版本 sqoop-1.4.6-cdh5.7.0 安装包 ...
- OO第三阶段总结
软件形式化方法历史 形式化方法的研究高潮始于20世纪60年代后期,针对当时所谓"软件危机",人们提出种种解决方法,归纳起来有两类:一是采用工程方法来组织.管理软件的开发过程:二是深 ...
- 虚拟树研究-CheckBox初步判断只能在第一列
//虚拟树研究-CheckBox初步判断只能在第一列 procedure TWindowsXPForm.XPTreeInitNode(Sender: TBaseVirtualTree; ParentN ...
- python - 自定制property/property的延时计算
自定制prooerty: #模拟@property 实现将类的函数属性变成类属性: #定义描述符 class msf(): def __init__(self,obj): self.obj = obj ...
- Android中的Service:Binder,Messenger,AIDL
http://blog.csdn.net/luoyanglizi/article/details/51594016 http://blog.csdn.net/luoyanglizi/article/d ...
- Java InputStream 、 InputStreamReader和BufferedReader
https://blog.csdn.net/zgljl2012/article/details/47267609 在Java中,上述三个类经常用于处理数据流,下面介绍一下三个类的不同之处以及各自的用法 ...
- UML和模式应用3:迭代和进化式分析和设计案例研究
1.前言 如何进行迭代和进化式分析和设计?将采用案例研究的方式贯穿始终.案例研究所包含的内容: UI元素 核心应用逻辑层 数据库访问 与外部软硬构件的协作 本章关于OOA/D主要介绍核心应用逻辑层 2 ...