luogu 1477 [NOI2008] 假面舞会

容易发现:

  • 如果图中没有环,那么面具种数一定是所有联通块内最长链之和,最少为 \(3\) 。

  • 如果有环,则面具种数一定是所有环的大小的最大公约数。

那么只要求出每一个联通块内的最长链与环即可。

由于是有向边,难以通过有向边判断联通块,因此考虑建立一个反向边。将原来的边边权设为 \(1\) ,反向边边权设为 \(-1\) 。

在 \(\text{dfs}\) 时记录这个联通块内最大、最小的 \(dep\) ,相减即为最长链。而如果遇到了已经访问过的点,那么一定有环。

#include<bits/stdc++.h>
using namespace std;
#define infll 0x7f7f7f7f7f7f7f7fll
#define inf 0x3f3f3f3f
#define Maxn 100005
#define Maxm 1000005
typedef long long ll;
inline int rd()
{int x=0;char ch,t=0;while(!isdigit(ch = getchar())) t|=ch=='-';while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();return x=t?-x:x;
}
int gcd(int x,int y){ return (y==0)?x:gcd(y,x%y); }
int n,m,tot,ans1,ans2,maxx,minn;
int dfn[Maxn],hea[Maxn],nex[Maxm<<1],ver[Maxm<<1],edg[Maxm<<1];
bool vis[Maxn];
void add(int x,int y,int d){ ver[++tot]=y,nex[tot]=hea[x],hea[x]=tot,edg[tot]=d; }
void dfs(int x,int Dep)
{if(vis[x]) { ans1=gcd(ans1,abs(Dep-dfn[x])); return; }dfn[x]=Dep,vis[x]=true;maxx=max(maxx,dfn[x]),minn=min(minn,dfn[x]);for(int i=hea[x];i;i=nex[i]) dfs(ver[i],Dep+edg[i]);
}
int main()
{n=rd(),m=rd();for(int i=1,x,y;i<=m;i++) x=rd(),y=rd(),add(x,y,1),add(y,x,-1);for(int i=1;i<=n;i++) if(!vis[i])maxx=-inf,minn=inf,dfs(i,0),ans2+=maxx-minn+1;if(ans1){if(ans1<3) printf("-1 -1\n");else{for(int i=3;i<=ans1;i++)if(ans1%i==0) { printf("%d %d\n",ans1,i); break; }}}else{if(ans2<3) printf("-1 -1\n");else printf("%d 3\n",ans2);}return 0;
}

【做题记录】[NOI2008] 假面舞会—有向图上的环与最长链相关推荐

  1. [Noi2008]假面舞会(dfs判环)

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

  2. bzoj 1064: [Noi2008]假面舞会(DFS)

    1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2240  Solved: 1083 [Submit][Sta ...

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

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

  4. 概率期望题(期望 DP)做题记录

    概率期望题(期望 DP)做题记录 P3830 [SHOI2012]随机树 难点在于第二问:生成树的期望深度. 不 wei zhuo 捏,设 \(dp_{i,j}\) 表示已经有了 \(i\) 个叶子结 ...

  5. 数数题(计数类 DP)做题记录

    数数题(计数类 DP)做题记录 CF1657E Star MST 我们称张无向完全图是美丽的当且仅当:所有和 \(1\) 相连的边的边权之和等于这张完全图的最小生成树的边权之和. 完全图点数为 \(n ...

  6. 退役前的做题记录5.0

    退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树 ...

  7. [BZOJ]1064 [NOI2008] 假面舞会 dfs判环

    1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2160  Solved: 1047 [Submit][Sta ...

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

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

  9. 1064: [Noi2008]假面舞会

    1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1960  Solved: 941 [Submit][Stat ...

最新文章

  1. 服务器登录中心,为数据中心配置登陆服务器来进行远程访问
  2. docker容器互联
  3. 使用php+phantomjs构建一只简单爬虫的开发思路
  4. mysql字段默认值不生效的问题解决(上)
  5. 笨办法学 Python · 续 练习 6:`find`
  6. html简单弹窗代码_真的!!!两行css代码实现瀑布流,html,css最简单的瀑布流实现方式且没有缺点!...
  7. Codeforces Round #467 (Div. 1): A. Save Energy!(公式)
  8. android错误详细教程四
  9. 装饰器结构应用与基本使用(611)
  10. 远控免杀从入门到实践 (11) 终结篇
  11. 电子商务概论学习总结
  12. HTML5超级链接、图片与多媒体
  13. RK3399外设驱动之PWM驱动:红外驱动
  14. 软件有计算机id如何生成注册号码,苹果账号注册方法:如何申请苹果id账号
  15. 【计算机组成原理】 数据的表示和运算
  16. Gazebo模型制作dae
  17. CSV文件及用Excel正确的打开方式
  18. GraphSAGE 源代码 -- 分图训练
  19. 网络协议分为哪几层---物理层,连接层,网络层,传输层,应用层详解
  20. 网络营销的多种表现形式

热门文章

  1. php 如何生成exe文件怎么打开,如何把PHP转成EXE文件
  2. C++中 Map的了解与基本用法(代码演示+自我总结+map中一对多的用法)
  3. android socket 服务端,Android socket 服务端
  4. [SpringSecurity]web权限方案_CSRF功能
  5. [蓝桥杯][基础练习VIP]FJ的字符串-递归
  6. python二维散点分布图_深入理解皮尔逊相关系数amp;python代码
  7. PHP数组加表格_php数组输出html表格的操作方法
  8. java计算字符串中字符出现的次数_java – 计算字符串中字符出现次数
  9. LeetCode动态规划 分割等和子集
  10. HDU 6750 Function(莫比乌斯反演)(2020百度之星初赛1)