如果没有环那么最大的面具的种类为所有联通块最长链之和、最小为3,如果最长链之和<3,则无解;

如果有环找出每个环的结点个数=、=面具种类数为所有环的结点个数的最大公约数x。

为什么呢

一个环1->2,2->3,3->4,4->5,5->6,6->1;那么可能的面具数为6或3种,是6的约数。

如果公约数小于3无解,大于3有解,最小的面具种数一定是>=3,<=x的一个x的约数。

那么最长链怎么求呢?
3->2->1->4->5;

如果枚举的话第一个是1,要求到最长链要枚举到3。。。。我们可以建立边的时候1->4这条边分为1->4为权值为1的边,4->1为权值为-1的边。那么枚举到1时,从1开始dfs,求每个点的dis,dis[3] = -2,dis[5] = 2;那么最长链的大小为dis[5] - dis[3] + 1;即遍历一次,最大的dis - 最小的dis +1;

那么环的个数怎么求呢?

tarjian?不行啊比如1->2->3.然而还有1->3这条边,然而这是个环,按以上建图法,tarjian回把它算为一个大小为3的环。。。然而这个环是不合法的。。。。所以我们采用dfs,如果没点v遍历过更新dis,如果遍历过环的大小为abs(dis[x] + tow - dis[v])(v是从x变了过来的,x->v这条边的边权为tow; )

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n, m;
int tov[2000005],h[100005],tp, nex[2000005], tow[2000005];
int vis[100005], dis[100005], ma, vis1[100005], maa, mii,dis1[100005];
void read(int &x)
{x = 0;char c = getchar();while(c < '0' || c > '9'){c = getchar();}while( c >= '0' && c <= '9'){x = 10 * x + c -'0';c = getchar();}
}
int gcd(int n, int m)
{if(m == 0) return n;return gcd(m, n%m);
}
void add(int x,int y,int w)
{tp ++;nex[tp] = h[x];tow[tp] = w;h[x] = tp;tov[tp] = y;
}
void dfs(int x, int fa)
{for(int i = h[x]; i; i = nex[i]){int v = tov[i];if(v == fa) continue;if(vis[v] == 1){int ha = dis[v] - (dis[x] + tow[i]);if(ha < 0) ha = (-1) * ha;if(ma == 0) ma = ha;else{if(ha != 0){ma = gcd(ma,ha);}}}else {vis[v] = 1;dis[v] = dis[x] + tow[i];dfs(v,x);}}
}
void dfs1(int x, int fa)
{for(int i = h[x]; i; i = nex[i]){int v = tov[i];if(vis1[v] == 1 || v == fa) continue;maa = max(maa , dis1[x] + tow[i]);mii = min(mii , dis1[x] + tow[i]);dis1[v] = dis1[x] + tow[i];vis1[v] = 1;dfs1(v,x);}
}
int main()
{read(n);read(m);for(int i = 1; i <= m; i++){int x,y;read(x);read(y);add(x,y,1);add(y,x,-1);}for(int i = 1; i <= n; i++){if(vis[i] == 0){vis[i] = 1;dfs(i,i);} }if(ma == 0){int zm = 0;for(int i = 1; i <= n; i++){if(vis1[i] == 0){maa = 0, mii = 0; vis1[i] = 1;dfs1(i,i);zm = zm + (maa - mii + 1);}}if(zm < 3){printf("-1 -1");return 0;}printf("%d 3",zm);}else{if(ma < 3) {printf("-1 -1");return 0;}int mi = 0;for(int i = 3; i <= ma; i++){if(ma % i == 0) {mi = i;break;}}printf("%d %d",ma,mi);}return 0;
} 

NOI 2008 假面舞会相关推荐

  1. [NOI 2008]假面舞会(综合图论)

    [题目大意]: 一共有n个人,每个人都带着面具,然后一共有k类面具,并且知道k>=3.只有带第i-1类面具的人能看到带第i类面具的人,带第k类面具的人能看到带第1类面具的人.告诉你m个信息,谁能 ...

  2. [BZOJ 1064][NOI 2008]假面舞会(图论+BFS)

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=1064 题目大意 给一个有向图染色,一个点的后继的颜色必须全部相同,问最多多少种颜色,最少多 ...

  3. 【BZOJ 1064】【NOI 2008】假面舞会

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

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

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

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

    luogu 1477 [NOI2008] 假面舞会 容易发现: 如果图中没有环,那么面具种数一定是所有联通块内最长链之和,最少为 \(3\) . 如果有环,则面具种数一定是所有环的大小的最大公约数. ...

  6. 【图论 搜索】bzoj1064: [Noi2008]假面舞会

    做到最后发现还是读题比赛:不过还是很好的图论题的 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选 ...

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

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

  8. 假面舞会狂欢节·圆桌 | 当Thinker遇上Artist

    本期将同大家一起回顾 Tspace 与古国序列 CTO 小南. NFTBox 社区代表 MAX .Amplio Capital VP 范媛媛.業YeahDAO 发起人 Lulu.ART101 首席艺术 ...

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

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

最新文章

  1. Theano 中文文档 0.9 - 7.2.5 循环
  2. JavaScript解析顺序和变量作用域
  3. 使用HTML语言编写HTML教程,HTML教程:HTML编写小经验
  4. 封神系统-运维大脑的日志检测
  5. [渝粤教育] 辽宁对外经贸学院 国际集装箱多式联运 参考 资料
  6. ImageLoader加载图片
  7. encapsulation java_Java - 封装(Encapsulation)
  8. python购物车代码_(Python基础)简单购物车代码
  9. 思维导图做会议记录丨做年终终结都都都很合适
  10. ucore操作系统 lab1 实验报告
  11. vptr初始化语义学
  12. 论文导读 | 图上的可达性问题
  13. 超链接 qq群一键添加
  14. IT公民:293个公司人压力和心理调查
  15. (真实经验)我干了5年的JAVA面试官,发现很多求职者都忽略这七大方面的问题!
  16. 重庆大学明月科创班课程记录2.1大一下定量工程设计-定倾角船舶设计(Matlab)
  17. Kubernetes1.13集群安装dashboard 1.10.1
  18. java对接支付宝(四)-即时到账无秘退款
  19. 物体的轴向指向目标(LookAt高级版)
  20. 乔治亚理工计算机在线申请,经验分享:佐治亚理工学院CS PhD申请总结

热门文章

  1. 台式计算机用u盘给电脑安装系统,台式电脑怎么用U盘重装Win7系统
  2. winform访问被拒绝_c#串口提示端口访问被拒绝
  3. 图灵机是最早的计算机,计算机发展史之图灵机
  4. dota2大魔导师出装java_DOTA2酱油大魔导师拉比克加点出装攻略
  5. Spark中组件Mllib的学习11之使用ALS对movieLens中一百万条(1M)数据集进行训练,并对输入的新用户数据进行电影推荐
  6. 计算机文档库怎么进,Windows电脑注册表怎么进?
  7. Linux运维-day44-综合架构-playbook剧本的变量、条件语句及循环语句
  8. (6)电报机与继电器
  9. 最不常用置换算法LFT 最久未使用置换算法LRU 操作系统 C语言链表实现
  10. 测量工具----示波器