题意: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则无解

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=;
const int M=;
int n,m,tot,maxn,minn,ansmin,ansmax;
int dis[N],head[N],vis[N],ver[M],nxt[M],edge[M];
void add(int u,int v,int d)
{
tot++;
nxt[tot]=head[u];
ver[tot]=v;
edge[tot]=d;
head[u]=tot;
}
int gcd(int x,int y)
{
if(!y) return x;
return gcd(y,x%y);
}
void dfs1(int x,int fa)//找环
{
vis[x]=;
for(int i=head[x];i;i=nxt[i])
{
int v=ver[i];
if(v!=fa)
{
if(!vis[v])vis[v]=,dis[v]=dis[x]+edge[i],dfs1(v,x);
else ansmax=gcd(ansmax,abs(dis[x]-dis[v]+edge[i]));
}
}
}
void dfs2(int x,int fa)//处理森林
{
vis[x]=;
maxn=max(dis[x],maxn);
minn=min(minn,dis[x]);
for(int i=head[x];i;i=nxt[i])
{
int v=ver[i];
if(v!=fa)
if(!vis[v])
vis[v]=,dis[v]=dis[x]+edge[i],dfs2(v,x);
}
}
int main()
{
scanf("%d%d",&n,&m);
while(m--)
{
int a,b; scanf("%d%d",&a,&b);
add(a,b,); add(b,a,-);
}
for(int i=;i<=n;i++) if(!vis[i]) dfs1(i,);
if(ansmax) for(ansmin=;ansmin<=ansmax&&ansmax%ansmin;ansmin++);
else
{
ansmin=;memset(vis,,sizeof(vis));
for(int i=;i<=n;i++)
if(!vis[i])
{
maxn=minn=,dis[i]=;
dfs2(i,);ansmax+=maxn-minn+;
}
}
if(ansmax<=) ansmax=ansmin=-;
printf("%d %d\n",ansmax,ansmin);
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 假面舞会题解

    莫名其妙的变成了我们的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. Git教程之使用GitHub

    我们一直用GitHub作为免费的远程仓库,如果是个人的开源项目,放到GitHub上是完全没有问题的.其实GitHub还是一个开源协作社区,通过GitHub,既可以让别人参与你的开源项目,也可以参与别人 ...

  2. C#.Net 如何动态加载与卸载程序集(.dll或者.exe)4-----Net下的AppDomain编程 [摘录]

    最近在对AppDomain编程时遇到了一个问题,卸载AppDomain后,在内存中还保留它加载的DLL的数据,所以即使卸载掉AppDomain,还是无法更新它加载的DLL.看来只有关闭整个进程来更新D ...

  3. 如何把Excel另存为XML格式文件(快速转换)

    这时,我们尝试另存为另一种文件类型: XML电子表格2003(*.xml)

  4. POJ2528 线段树的区间操作

    首先应该对该[0,10000000]进行离散化 即先将点集进行排序,然后从小到大缩小其中的间距,使得最后点数不会超过2*n 然后就是线段树操作 只需进行染色,然后最后用nlgn进行一个个查询颜色记录即 ...

  5. innodb master thread 工作原理

    参考 innodb参数汇总  InnoDB的Master Thread工作原理 innodb_max_dirty_pages_pct 默认值 show variables like 'innodb_m ...

  6. 扫描.net dll引用dll

    最近升级系统里的NHibernate,从3.3到4,项目工程太多, 一个模块分bll,dal,model,web,test,10几个模块,就要60多dll,升级一次太头疼. 编译过后,有时候会有的dl ...

  7. HNOI2008明明的烦恼

    写的很好的题解:http://www.cnblogs.com/zhj5chengfeng/archive/2013/08/23/3278557.html 我这种蒻蒻什么都不会啊…… 代码:(copy的 ...

  8. JqueryEasyUI 增加选项卡

    function addTab(subtitle,url){ if(!$('#tabs').tabs('exists',subtitle)){ $('#tabs').tabs('add',{ titl ...

  9. UVA 1324 The Largest Clique 最大团(强连通分量,变形)

    题意:给一个有向图,要求找出一些点,使得这些点中的任意点对,要么可以互通,要么单向可达. 思路:最低只要求单向可达即可,即a->b都可以算进去. 强连通分量内的点肯定是满足要求的,可以全选,但是 ...

  10. 优秀it博客和文章

    优秀博客 综合 杨文博(供职于百度公司,任复合搜索部资深研发工程师,目前作为tech lead,负责垂直行业搜索后端架构研发.) 杨远骋 徐宥(Google 软件工程师. 这个中文博客是我的思考记录, ...