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,每个点有一个值,经过一条边到另一个点之后,用原来的点值和边权 ...
随机推荐
- DOCTYPE 中xhtml 1.0和 html 4.01区别分析
前者相对于后者有以下特性: 1.所有的标记都都要闭合 所有的标记都要闭合,如果是单独不成对的标签,在标签最后加一个"/"来关闭它.例如: <h6>close tag & ...
- MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合
一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:create -DgroupId=me.gacl -DartifactId=spring4-myba ...
- Extract QQ from iPhone and analyze it
QQ is one of the most popular chat App in the world. Now let me show you how to extract QQ from iPho ...
- DataAdapter与DataSet的使用
1.创建数据库连接: 2.创建数据适配器(Adapter); 3.创建容器数据集(DataSet); 4.从数据集中取出指定表: 5.遍历表数据并输出: using System; using Sys ...
- scrollView实现基础中心点缩放及与UIPageControl结合使用
一般来说scrollView与UIPageControl都是结合使用,因为在使用滚动视图的时候 ,使用UIPageControl,用户可以 清楚 的明白显示的内容有多少页,如果 没有的话,总不能让用户 ...
- windows下Redis编译安装
redis是现在比较流行的noSQL,主流大型网站都用的比较多,很多同学不知道怎么安装,这里介绍在windows下面安装以及扩展,提供学习使用,实际使用环境多在Linux下. 首先到相应网站下载red ...
- HP XP7 GAD双活实现的理解
XP7双活的虚拟卷global active device (GAD)实际上对应两个存储的两个物理卷(有点儿像Mirror Disk镜像) 当主机A向阵列A发出写数据请求后,阵列A首先检查要被写入的数 ...
- oracle常用操作指令
1.cmd sqlplus /nolog; 2.conn sys/ as sysdba; 3.create user query identified by query;//创建用户 4.al ...
- css 层的嵌套
html <div class="menu"> <ul> <li><a class="li1" title=" ...
- AngularJS学习--- AngularJS中数据双向绑定(two-way data-binding) orderBy step4
1.切换工作目录 git checkout step- #切换分支,切换到第4步 npm start #启动项目 2.代码 app/index.html Search: <input ng-mo ...