题意:戳这里

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

就两种图形:

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. mssql 动态行转列。

    )) ,'张三' ,'李四' ,'王五' select * from #a a b ----------- ---- 张三 李四 王五 ( 行受影响) --行转列,步骤:''+张三+],[+王五+], ...

  2. Analyze network packet files very carefully

    As a professional forensic guy, you can not be too careful to anlyze the evidence. Especially when t ...

  3. Eclipse下修改工程名

    汇总下网上的方法. 一. 右键工程:Refactor->Rename,或选中工程按F2,修改名称 二. 右键工程:Properties->Web Project Settings,修改Co ...

  4. centos安装zendopcache

    由于linux用的还不熟,导致很简单的一次安装过程遇到一堆问题,还好最后安装成功了,备忘就写在这里了. zendopcache的的主要原理: PHP执行后的数据缓冲到内存中避免重复的编译,能够直接使用 ...

  5. MS SQL Server之光标、存储过程和触发器

    光标 通常数据库操作被认为是以数据集为基础的操作,但是光标被用于以记录为单位来进行操作,来获取数据库中的数据的子集.光标一般用于过程化程序里的嵌入的SQL语句. 对光标的定义如下: DECLARE C ...

  6. Factstone Benchmark

    [问题描述] Amtel已经宣布,到2010年,它将发行128位计算机芯片:到2020年,它将发行256位计算机:等等,Amtel坚持每持续十年将其字大小翻一番的战略.(Amtel于2000年发行了6 ...

  7. 【BootStrap】 基础

    [BootStrap] 基础 一. 自适应(针对不同设备如手机平板笔电,使页面的宽度适应设备宽度) <meta name="viewport" content="w ...

  8. MVC4下配置log4net 五部曲

    第一步:把log4net.dll 编译成Framework 4.0 第二步:找到项目的Properties下的AssemblyInfo.在最下面添加:[assembly: log4net.Config ...

  9. 如何把android中布局文件(.xml)与相关的类(.java)进行关联?

    eg:把一个布局文件名为page1.xml与MainActivity.java(工程自动生成)进行 1.在存放使用资源的res文件夹下的layout文件夹内新建一个XML布局文件,如命名为:page1 ...

  10. 手机驱动无法正常安装,出现adb interface失败

    手机一直无法用usb连接上电脑,试了各种方法,总是提示安装驱动失败,或者找不到文件. 在网上找了各种方法,后来结果证明,是我自己手贱了,... 方法: Win7系统用户已经碰到几次在安装adb驱动时提 ...