题意:戳这里

思路:很明显是一个图论模型。。

就两种图形:

1、图中存在环,那么就是所有环的gcd为最大答案。gcd的大于3的最小约数为最小答案

2、不存在环,那么是每个弱连通块的最长链之和为最大答案,最小答案为3。。

但是这一题最关键的是实现,实现技巧太赞了。。

首先,我们可以把每条有向边(u, v)拆成(u, v, 1), (v,  u, -1)

那么对于第二情况,对于每一个联通块直接随便找一个bfs,然后最长链就是maxdist-mindist+1

对于第一种情况,可能出现环套环的情况,这样处理起来很麻烦。。

但实际上很容易发现对于大环套小环实际上大环可以转换成大环-小环剩下的小圈求gcd。。注意这里的小圈不一定是环,因为边有正有负。。

这样正好处理可以一遍dfs处理。。

说得很抽象。。直接看这位神犇博客的图吧。。

code:

 #include <bits/stdc++.h>
#define M0(a) memset(a, 0, sizeof(a))
#define x first
#define y second
#define vii vector< pair<int, int> >::iterator
using namespace std;
const int maxn = ;
vector< pair<int, int> > e[maxn];
int n, m; int vis[maxn], d[maxn];
void init(){
for (int i = ; i <= n; ++i) e[i].clear();
int u, v;
pair<int, int> tmp;
for (int i = ; i < m; ++i){
scanf("%d%d", &u, &v);
tmp.x = v, tmp.y = ;
e[u].push_back(tmp);
tmp.x = u, tmp.y = -;
e[v].push_back(tmp);
}
} int ans;
void gao1(){
int ans1 = ans, ans2 = ans;
if (ans1 < ){
puts("-1 -1"); return;
}
for (int j = ; j <= ans; ++j) if (ans % j == ){
ans2 = j; break;
}
printf("%d %d\n", ans1, ans2);
} int bfs(const int s){
queue<int> q;
q.push(s), d[s] = , vis[s] = ;
int u, v, w;
int maxdist= , mindist = ;
while (!q.empty()){
u = q.front();
q.pop();
for (vii it = e[u].begin(); it != e[u].end(); ++it){
v = it->x, w = it->y;
if (vis[v]) continue;
d[v] = d[u] + w;
if (d[v] > maxdist) maxdist = d[v];
if (d[v] < mindist) mindist = d[v];
vis[v] = , q.push(v);
}
}
return maxdist - mindist + ;
} void gao2(){
M0(vis), M0(d);
int ans1 = ;
for (int i = ; i <= n; ++i) if (!vis[i])
ans1 += bfs(i);
if (ans1 < ) puts("-1 -1");
else printf("%d %d\n", ans1, );
} void dfs(int u){
vis[u] = ;
int v;
for (vii it = e[u].begin(); it != e[u].end(); ++it){
v = it->x;
if (vis[v])
ans = __gcd(ans, abs(d[u] + it->y - d[v]));
else
d[v] = d[u] + it->y, dfs(v);
}
} void solve(){
M0(vis), M0(d);
ans = ;
for (int i = ; i <= n; ++i) if (!vis[i])
dfs(i);
if (ans) gao1();
else gao2();
} int main(){
freopen("a.in", "r", stdin);
while (scanf("%d%d", &n, &m) != EOF){
init();
solve();
}
}

bzoj 1064的更多相关文章

  1. BZOJ 1064 假面舞会(NOI2008) DFS判环

    此题,回想Sunshinezff学长给我们出的模拟题,原题啊有木有!!此处吐槽Sunshinezff爷出题不人道!! 不过也感谢Sunshinezff学长的帮助,我才能做出来.. 1064: [Noi ...

  2. [bzoj 1064][NOI2008]假面舞会(dfs判断环)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1064 分析: 如果a看到b,则a->b 那么: 1.如果图中有环,则说明这个环的 ...

  3. bzoj 1064【noi2008】假面舞会

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1064 给一个有向图染色,每个点的后继必须相同,问至少&至多有多少种染色方案 sol: ...

  4. BZOJ 1064 假面舞会

    http://www.lydsy.com/JudgeOnline/problem.php?id=1064 思路:第一眼看的时候以为是差分约束,但是是做不了的,不过能保证的就是这题绝对是图论题...(废 ...

  5. BZOJ 1064: [Noi2008]假面舞会(dfs + 图论好题!)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1064 题意: 思路: 考虑以下几种情况: ①无环并且是树: 无环的话就是树结构了,树结构的话想一下就 ...

  6. [BZOJ]1064: [Noi2008]假面舞会

    题目大意:n个人,k种假面,每人戴一种,戴第i种的可以看见第i+1种,戴第k种的可以看见第1种,给出m条关系表示一个人可以看到另一个人,问k可能的最大值和最小值.(n<=100,000,m< ...

  7. bzoj 1064 假面舞会 图论??+dfs

    有两种情况需要考虑 1.链:可以发现对最终的k没有影响 2.环:如果是真环(即1->2->3->4->1),可以看出所有可行解一定是该环的因数 假环呢??(1->2-&g ...

  8. bzoj 1064 noi2008 假面舞会题解

    莫名其妙的变成了我们的noip互测题... 其实这题思想还是比较简单的,只是分类不好分而已 其实就是一个dfs的事 首先,非常明显,原题目中的所有关系可以抽象成一个图(这是...显而易见的吧...) ...

  9. bzoj 1064 图论

    我们根据能否看见建图,有向图边权设成1,然后我们转成无向图, 对于每条有向边连一条反边,边权是-1,然后从每个块中任意一个点开始 dfs,每个点有一个值,经过一条边到另一个点之后,用原来的点值和边权 ...

随机推荐

  1. JSP、HTML标签

    <%@ ...%> 表示是指令,主要用来提供整个JSP 网页相关的信息,并且用来设定JSP网页的相关属性,例如:网页的编码方式.语法.信息等.起始符号为: <%@ 终止符号为: %& ...

  2. Python之路【第十五篇】:Web框架

    Python之路[第十五篇]:Web框架   Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 1 2 3 4 5 6 ...

  3. jquery点击添加样式,再点击取出样式

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  4. 阿里巴巴分布式服务框架Dubbo介绍(1)主要特色

    引言 互联网服务和BS架构的传统企业软件相比,系统规模上产生了量级的差距.例如 传统BS企业内部门户只需要考虑数百人以及几千人的访问压力,而大型互联网服务有时需要考虑的是千万甚至上亿的用户: 传统企业 ...

  5. CentOS网络配置详解

    转载于CentOS中文站:http://www.centoscn.com/CentOS/2015/0507/5376.html一.配置文件详解 在RHEL或者CentOS等Redhat系的Linux系 ...

  6. 1-9 TCP/IP参考模型

    ISO/OSI参考模型与TCP/IP模型对比 一.网络访问层 功能:包括IP地址与物理硬件地址的映射以及将IP地址封装成帧. 基于不同类型的网络接口,网路访问层定义了和物理介质的连接 网路访问层包含了 ...

  7. vc 中调用COM组件的方法

    需求:1.创建myCom.dll,该COM只有一个组件,两个接口:   IGetRes--方法Hello(),   IGetResEx--方法HelloEx() 2.在工程中导入组件或类型库  #im ...

  8. 《Linux内核设计与实现》读书笔记 第一章 Linux内核简介

    一.相关历史 1. Unix内核的特点 简洁:仅提供系统调用并有一个非常明确的设计目的 抽象:几乎所有东西都被当做文件 可移植性:使用C语言编写,使得其在各种硬件体系架构面前都具备令人惊异的移植能力 ...

  9. centos7 u盘启动路径设置

    进入安装页面选择install centos7,按tab按键,设置路径如下 vmlinuz initrd=initrd.img inst.stage2=hd:/dev/sdb4 quiet

  10. Python_sklearn机器学习库学习笔记(一)_一元回归

    一.引入相关库 %matplotlib inline import matplotlib.pyplot as plt from matplotlib.font_manager import FontP ...