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 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择 ...
随机推荐
- Java_myBatis_xml代理写法
这种开发方式只需要写好Mapper.xml和对应的Interface就可以了. 1.编写Mapper.xml <?xml version="1.0" encoding=&qu ...
- JavaSE学习总结(十六)—— 泛型与泛型应用
一.泛型概要 泛型(Generic)的本质是类型参数化,通俗的说就是用一个占位符来表示类型,这个类型可以是String,Integer等不确定的类型,表明可接受的类型. 泛型是Java中一个非常重要的 ...
- JAVA-集合类型Set常用操作例子(基础必备)
package com.net.xinfang.reflect; import java.util.Comparator; import java.util.HashSet; import java. ...
- JAVA记录-异常基本概念
1.异常分类 2.错误和异常的区别 3.try-catch-xxx处理方式 Java Exception:1.Error 2.Runtime Exception 运行时异常3.Exception 4. ...
- WebLogic 中的基本概念【转】
完全引用自: WebLogic 中的基本概念 WebLogic 中的基本概念 上周参加了单位组织的WebLogic培训,为了便于自己记忆,培训后,整理梳理了一些WebLogic的资料,会陆续的发出来, ...
- css去除苹果默认样式
input[type="button"], input[type="submit"], input[type="reset"] { -web ...
- Github安全整理(转载)
刚好这两天对之前github上关注的一些比较有意思的项目进行了一下分类整理,在这里列出来分享给大家,希望能对大家寻找工具或者资源有所帮助. 大部分Repo是关于安全以及Python的,也有一些其他主题 ...
- 使用Jupyter lab前应该读的几篇文章
知乎上的一篇文章: 如何优雅的使用Jupyter? Jupyter Lab原来还有如下使用方式: 执行Shell命令 Hintland(提示命令).snippets(插入代码段).一键美化代码等功能( ...
- C. Trailing Loves (or L'oeufs?)
题目链接:http://codeforces.com/contest/1114/problem/C 题目大意:给你n和b,让你求n的阶乘,转换成b进制之后,有多少个后置零. 具体思路:首先看n和b,都 ...
- curl命令下载jdk
第一步:找到下载地址 第二步:下载