bzoj 1064
题意:戳这里
思路:很明显是一个图论模型。。
就两种图形:
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的更多相关文章
- BZOJ 1064 假面舞会(NOI2008) DFS判环
此题,回想Sunshinezff学长给我们出的模拟题,原题啊有木有!!此处吐槽Sunshinezff爷出题不人道!! 不过也感谢Sunshinezff学长的帮助,我才能做出来.. 1064: [Noi ...
- [bzoj 1064][NOI2008]假面舞会(dfs判断环)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1064 分析: 如果a看到b,则a->b 那么: 1.如果图中有环,则说明这个环的 ...
- bzoj 1064【noi2008】假面舞会
题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1064 给一个有向图染色,每个点的后继必须相同,问至少&至多有多少种染色方案 sol: ...
- BZOJ 1064 假面舞会
http://www.lydsy.com/JudgeOnline/problem.php?id=1064 思路:第一眼看的时候以为是差分约束,但是是做不了的,不过能保证的就是这题绝对是图论题...(废 ...
- BZOJ 1064: [Noi2008]假面舞会(dfs + 图论好题!)
http://www.lydsy.com/JudgeOnline/problem.php?id=1064 题意: 思路: 考虑以下几种情况: ①无环并且是树: 无环的话就是树结构了,树结构的话想一下就 ...
- [BZOJ]1064: [Noi2008]假面舞会
题目大意:n个人,k种假面,每人戴一种,戴第i种的可以看见第i+1种,戴第k种的可以看见第1种,给出m条关系表示一个人可以看到另一个人,问k可能的最大值和最小值.(n<=100,000,m< ...
- bzoj 1064 假面舞会 图论??+dfs
有两种情况需要考虑 1.链:可以发现对最终的k没有影响 2.环:如果是真环(即1->2->3->4->1),可以看出所有可行解一定是该环的因数 假环呢??(1->2-&g ...
- bzoj 1064 noi2008 假面舞会题解
莫名其妙的变成了我们的noip互测题... 其实这题思想还是比较简单的,只是分类不好分而已 其实就是一个dfs的事 首先,非常明显,原题目中的所有关系可以抽象成一个图(这是...显而易见的吧...) ...
- bzoj 1064 图论
我们根据能否看见建图,有向图边权设成1,然后我们转成无向图, 对于每条有向边连一条反边,边权是-1,然后从每个块中任意一个点开始 dfs,每个点有一个值,经过一条边到另一个点之后,用原来的点值和边权 ...
随机推荐
- JSP、HTML标签
<%@ ...%> 表示是指令,主要用来提供整个JSP 网页相关的信息,并且用来设定JSP网页的相关属性,例如:网页的编码方式.语法.信息等.起始符号为: <%@ 终止符号为: %& ...
- Python之路【第十五篇】:Web框架
Python之路[第十五篇]:Web框架 Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 1 2 3 4 5 6 ...
- jquery点击添加样式,再点击取出样式
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 阿里巴巴分布式服务框架Dubbo介绍(1)主要特色
引言 互联网服务和BS架构的传统企业软件相比,系统规模上产生了量级的差距.例如 传统BS企业内部门户只需要考虑数百人以及几千人的访问压力,而大型互联网服务有时需要考虑的是千万甚至上亿的用户: 传统企业 ...
- CentOS网络配置详解
转载于CentOS中文站:http://www.centoscn.com/CentOS/2015/0507/5376.html一.配置文件详解 在RHEL或者CentOS等Redhat系的Linux系 ...
- 1-9 TCP/IP参考模型
ISO/OSI参考模型与TCP/IP模型对比 一.网络访问层 功能:包括IP地址与物理硬件地址的映射以及将IP地址封装成帧. 基于不同类型的网络接口,网路访问层定义了和物理介质的连接 网路访问层包含了 ...
- vc 中调用COM组件的方法
需求:1.创建myCom.dll,该COM只有一个组件,两个接口: IGetRes--方法Hello(), IGetResEx--方法HelloEx() 2.在工程中导入组件或类型库 #im ...
- 《Linux内核设计与实现》读书笔记 第一章 Linux内核简介
一.相关历史 1. Unix内核的特点 简洁:仅提供系统调用并有一个非常明确的设计目的 抽象:几乎所有东西都被当做文件 可移植性:使用C语言编写,使得其在各种硬件体系架构面前都具备令人惊异的移植能力 ...
- centos7 u盘启动路径设置
进入安装页面选择install centos7,按tab按键,设置路径如下 vmlinuz initrd=initrd.img inst.stage2=hd:/dev/sdb4 quiet
- Python_sklearn机器学习库学习笔记(一)_一元回归
一.引入相关库 %matplotlib inline import matplotlib.pyplot as plt from matplotlib.font_manager import FontP ...