[Noi2008]假面舞会
考试的时候果断放弃,cout<<"-1 -1"骗10分hhh。。。
这也是图上问题。注意题目意思:
①如果有多个点指向同一个点,那么他们属于同一类别。
②一个点看到的所有点是一个种类。
这样的话,就可以把信息变成一堆图和一堆链。注意分情况:
①如果全是链的话,那么种类最大是他们的长度,最小理论上是多少都可以。例如1->2->3->4->5->6,可以6个种类都不同,也可能1,2,3种类不同;4,5,6种类不同,3(种类3)可以看到4(种类1),实际是一个循环,但是图中是一个链。这样种类数可以随便划分。根据题意最小就是3。
②如果有环有链,那就只需要考虑环就行了。环最大种类是环的大小,同时这个环的约数也是可以满足的
综上,总结为:
所以如果有环找出这些环,k的最大值就是这些环的大小的最大公约数。
k的最小值就是k的最大值中第一个大于等于3的约数。
如果没有环,k的最大值就是所有等价链的链长之和。最小值显然是3.
注意环的大小与方向有关,反向是-1,正向是1,最后取abs即可。
然后我们dfs每个联通块。在dfs途中对每个点标号,标号的值就是已经经过的权值和。
在dfs中如果发现某个点已经被dfs过了。说明找到一个环。
那么这个环的大小就是你将要对他标的号和他已有的标号的差的绝对值。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#define pos(i,a,b) for(int i=(a);i<=(b);i++)
#define pos2(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
int n,m;
#define N 501000
int fa[N];
int mi[N],ma[N];
int tmp;
int abs(int x)
{
if(x<0)
return -x;
return x;
}
struct haha
{
int next,w,to;
}edge[N];
int head[N],cnt=1;
int val[N],flag[N];
int gcd(int x,int y)
{
return y==0?x:gcd(y,x%y);
} //求最大公约数
void add(int u,int v,int w)
{
edge[cnt].w=w;
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
int find(int x)
{
if(x!=fa[x])
fa[x]=find(fa[x]);
return fa[x];
}
void he(int x,int y)
{
int xx=find(x);
int yy=find(y);
if(xx!=yy)
fa[xx]=yy;
}//并查集查找是否属于一个联通块
int ans,ans2;//最大值,最小值
void dfs(int x)
{
ma[tmp]=max(ma[tmp],val[x]);//找连通块里面的最大值
mi[tmp]=min(mi[tmp],val[x]); //最小值
flag[x]=1;
for(int i=head[x];i;i=edge[i].next)
{
int to=edge[i].to;
int va=edge[i].w;
if(!flag[to])
{
val[to]=val[x]+va;//记录大小
dfs(to);
}
else
ans=gcd(ans,abs(val[x]+va-val[to]));// 所有环求公约数
}
}
int main()
{
scanf("%d%d",&n,&m);
memset(mi,0x3f,sizeof(mi));
pos(i,1,n)
fa[i]=i;
pos(i,1,m)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y,1);
add(y,x,-1);
he(x,y);
}
pos(i,1,n)
if(!flag[i])
{
tmp=find(i);
dfs(i);
}
pos(i,3,ans)
if(ans%i==0)
{
ans2=i;//大于三的最小公约数
break;
}
ans2=max(3,ans2);
int sum=0;
if(ans==0)
{
pos(i,1,n)
if(i==fa[i])
sum+=ma[i]-mi[i]+1;//是链最大是总和
ans=sum;
}
if(ans<3)
ans=ans2=-1;
printf("%d %d\n",ans,ans2);
while(1);
return 0;
}
[Noi2008]假面舞会的更多相关文章
- 图论 公约数 找环和链 BZOJ [NOI2008 假面舞会]
BZOJ 1064: [Noi2008]假面舞会 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1655 Solved: 798[Submit][S ...
- [BZOJ1064][Noi2008]假面舞会
[BZOJ1064][Noi2008]假面舞会 试题描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢 ...
- NOI2008假面舞会
1064: [Noi2008]假面舞会 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 883 Solved: 462[Submit][Status] ...
- 【洛谷】1477:[NOI2008]假面舞会【图论】
P1477 [NOI2008]假面舞会 题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会. 今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具 ...
- 【BZOJ1064】[Noi2008]假面舞会 DFS树
[BZOJ1064][Noi2008]假面舞会 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择 ...
- 【做题记录】[NOI2008] 假面舞会—有向图上的环与最长链
luogu 1477 [NOI2008] 假面舞会 容易发现: 如果图中没有环,那么面具种数一定是所有联通块内最长链之和,最少为 \(3\) . 如果有环,则面具种数一定是所有环的大小的最大公约数. ...
- 1064: [Noi2008]假面舞会 - BZOJ
Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办 ...
- 【BZOJ】1064: [Noi2008]假面舞会(判环+gcd+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1064 表示想到某一种情况就不敢写下去了.... 就是找环的gcd...好可怕.. 于是膜拜了题解.. ...
- 洛谷 P1477 [NOI2008]假面舞会
题目链接 题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会. 今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方 ...
- BZOJ1064 [Noi2008]假面舞会 【dfs】
题目 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号告诉拿 ...
随机推荐
- solr学习-基础环境搭建(一)
目前网上关于solr6.+的安装教程很少,有些6.0之前的教程在应用到6.+的版本中出现很多的问题,所以特别整理出来这一片文章,希望能给各位码农一些帮助! 很少写些文章,如有不对的地方,还希望多多指导 ...
- 【Android Developers Training】 38. 文件共享需求
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Centos操作系统在虚拟机VMware上的安装
1.下载centos操作系统,提供百度云盘链接:http://pan.baidu.com/s/1pLHOR03 2.打开上篇在VMware中新建好的空白虚拟机,将centos安装在此空白虚拟机上,步骤 ...
- Spring AOP的注解实现
适用场景: 记录接口方法的执行情况,记录相关状态到日志中. 注解类:LogMark.java package com.lichmama.spring.demo.annotation; import j ...
- NEWS-包名-baseTest-类名-BaseDao
package baseTest; import java.sql.Connection;import java.sql.DriverManager;//通过配置文件读取BASEDAOimport j ...
- Python学习笔记——import模块
OS模块 直接输出系统命令到屏幕,该方法获取的命令返回值不可被赋值给变量,输出结果受编码影响会乱码: import os os.system("ipconfig") 将执行获取的系 ...
- PostMessage,模拟键盘输入
for i := 0 to length(tel) do begin //SendMessage(cHwnd,WM_KEYDOWN,Integer(tel[ ...
- java操作DBF的使用
1.引入javadbf.4.1.jar 2. import com.linuxense.javadbf.DBFField; import com.linuxense.javadbf.DBFRead ...
- jdk和jre有什么区别?
简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境.SDK是Software Development Kit 一般指软件开发包,可以包括函数库.编译程序等. JDK就是Ja ...
- Hadoop集群的hbase介绍、搭建、环境、安装
1.hbase的介绍(自行百度hbase,比我总结的全面具体) HBase – Hadoop Database,是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBase技术可在廉价PC ...