[NOI2008]假面舞会——数论+dfs找环
思路
分三种情况讨论:
1.有环
那显然是对于环长取个\(gcd\)
2.有类环
也就是这种情况
1→2→3→4→5→6→7,1→8→9→7
假设第一条链的长度为\(l_1\),第二条为\(l_2\),那么\(l_1\)和\(l_2\)需要满足\(l_1\equiv l_2(mod\ k)\),也就是\(k|(l_1-l_2)\)。如果我们建权值为\(-1\)的反向边的话,找出来的环就涵盖了这种情况,并且取\(gcd\)就能满足等式
3.有链
对答案无影响
最后还需要加一个特判,就是只有链的情况
具体可以看代码
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <string>
#include <vector>
#include <cmath>
#include <ctime>
#include <queue>
#include <map>
#include <set>
using namespace std;
#define IINF 0x3f3f3f3f3f3f3f3fLL
#define ull unsigned long long
#define pii pair<int, int>
#define uint unsigned int
#define mii map<int, int>
#define lbd lower_bound
#define ubd upper_bound
#define INF 0x3f3f3f3f
#define vi vector<int>
#define ll long long
#define mp make_pair
#define pb push_back
#define N 100000
#define M 1000000
struct Edge {
int next, to, w;
}e[2*M+5];
int n, m, maxans, minans;
int fa[N+5], head[N+5], eid, vis[N+5], d[N+5];
int mmax[N+5], mmin[N+5];
int find(int x) {
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
int gcd(int a, int b) {
return !b ? a : gcd(b, a%b);
}
void addEdge(int from, int to, int w) {
e[++eid].next = head[from];
e[eid].to = to;
e[eid].w = w;
head[from] = eid;
}
void dfs(int u, int x) {
if(vis[u]) {
maxans = gcd(abs(x-d[u]), maxans);
return ;
}
vis[u] = 1;
mmin[find(u)] = min(mmin[find(u)], x);
mmax[find(u)] = max(mmax[find(u)], x);
d[u] = x;
for(int i = head[u]; i; i = e[i].next) {
int v = e[i].to, w = e[i].w;
dfs(v, x+w);
}
}
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i) fa[i] = i;
for(int i = 1, x, y; i <= m; ++i) {
scanf("%d%d", &x, &y);
addEdge(x, y, 1), addEdge(y, x, -1);
int fx = find(x), fy = find(y);
if(fx != fy) fa[fy] = fx;
}
memset(mmin, 0x3f, sizeof mmin);
for(int i = 1; i <= n; ++i) {
if(vis[i]) continue;
dfs(i, 0);
}
for(int i = 3; i <= maxans; ++i) {
if(maxans%i == 0) {
minans = i;
break;
}
}
if(!maxans)
for(int i = 1; i <= n; ++i)
if(find(i) == i)
maxans += mmax[i]-mmin[i]+1;
if(!minans) minans = 3;
if(maxans < 3) printf("-1 -1\n");
else printf("%d %d\n", maxans, minans);
return 0;
}
[NOI2008]假面舞会——数论+dfs找环的更多相关文章
- [NOI2008]假面舞会(DFS)
Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办 ...
- BZOJ1064 [Noi2008]假面舞会 【dfs】
题目 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号告诉拿 ...
- BZOJ1064 NOI2008假面舞会(dfs树)
将图中的环的长度定义为正向边数量-反向边数量,那么答案一定是所有环的环长的共同因子.dfs一下就能找到图中的一些环,并且图中的所有环的环长都可以由这些环长加加减减得到(好像不太会证).如果有环长为1或 ...
- BZOJ 1064: [Noi2008]假面舞会(dfs + 图论好题!)
http://www.lydsy.com/JudgeOnline/problem.php?id=1064 题意: 思路: 考虑以下几种情况: ①无环并且是树: 无环的话就是树结构了,树结构的话想一下就 ...
- 图论 公约数 找环和链 BZOJ [NOI2008 假面舞会]
BZOJ 1064: [Noi2008]假面舞会 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1655 Solved: 798[Submit][S ...
- 【BZOJ1064】[Noi2008]假面舞会 DFS树
[BZOJ1064][Noi2008]假面舞会 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择 ...
- [BZOJ1064][Noi2008]假面舞会
[BZOJ1064][Noi2008]假面舞会 试题描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢 ...
- NOI2008假面舞会
1064: [Noi2008]假面舞会 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 883 Solved: 462[Submit][Status] ...
- 【洛谷】1477:[NOI2008]假面舞会【图论】
P1477 [NOI2008]假面舞会 题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会. 今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具 ...
随机推荐
- 后端根据查询条件生成excel文件返回给前端,vue进行下载
一.HTML代码 <el-col :xs="2" :md="2" :sm="3"> <el-button type=&qu ...
- 在VMware上安装centos
Windows,VMware和Centos三者的关系 VMware安装.centos安装 在 VMware 上安装 CentOS 第 1 步:打开 VMware,点击创建新的虚拟机 第 2 步:选择典 ...
- Rocketmq-简单部署
一.准备环境 1.系统:Centos7.3(无硬性要求) 2. jdk:1.8 3.maven:3.5(无硬性要求) 4.git 5.rocketmq 4.2 二.环境部署 1.jdk1.8以及mav ...
- Fourier serie
你眼中看似落叶纷飞变化无常的世界,实际只是躺在上帝怀中一份早已谱好的乐章. 时域和频域就像观察一个物体一样,一个是主视图的,一个是侧视图. 1.在有限区间上由任意图形定义的任意函数都可以表示为单纯的正 ...
- [Cometoj#3 A]比赛_枚举/堆
比赛 题目链接:https://cometoj.com/contest/38/problem/A?problem_id=1534 数据范围:略. 题解: 原题没啥意思,就是个暴力枚举. 出了个加强版, ...
- 提取json字符串中指定格式中的参数值
直接上代码: import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; p ...
- linux中学习中提炼出来的命令
Linux: 基于debain的系统(如:Ubuntu等)pms基本工具:aptitude[apt-get],dpkgaptitude search package_name 查看软件包是否已安装,如 ...
- Technocup 2020 - Elimination Round 1补题
慢慢来. 题目册 题目 A B C D tag math strings greedy dp 状态 √ √ √ √ //∅,√,× 想法 A. CME res tp A 题意:有\(n\)根火柴,额外 ...
- 最长回文 HDU - 3068(马拉车算法)
Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入 ...
- vue的 :class 与 :style 的讲解
Vue样式: Vue中通过属性绑定为元素的class样式 第一种使用方式:直接传递一个数组 注意:这里的class需要使用v-bind做数据绑定 第二种使用方式:在数组中使用三元表达式 第三种使用方式 ...