bzoj 1064 图论
我们根据能否看见建图,有向图边权设成1,然后我们转成无向图,
对于每条有向边连一条反边,边权是-1,然后从每个块中任意一个点开始
dfs,每个点有一个值,经过一条边到另一个点之后,用原来的点值和边权
更新新的点的点值,那么如果我们访问到了一个原来已经走过的点,那么我们
找到了一个环(可能是非环,就是一个点出两条有向边,然后又交在一点了),由于
数据是合法的,所以这样的非环的现在应该更新成的点值和原有的点值相等,如果不相等
的话,取差值的绝对值,就是这个环的长度。
那么我们对于所有块,每个块的环的长度都是种类数的倍数,所以取gcd就好了
还有一种情况就是没有环,全都是以链的形式存在的,对于这种形式,我们每个块
染色,然后找到每个块中点值最大的最小的差值就是最长链的长度。
无解的情况比较容易讨论,在此不再赘述。
/**************************************************************
Problem:
User: BLADEVIL
Language: Pascal
Result: Accepted
Time: ms
Memory: kb
****************************************************************/
{$M 65536000}
//By BLADEVIL
var
n, m :longint;
pre, other, len :array[..] of longint;
last :array[..] of longint;
l :longint;
flag :array[..] of boolean;
size, father, key, tmin, tmax :array[..] of longint;
g :array[..] of longint;
ans1, ans2 :longint;
procedure swap(var a,b:longint);
var
c :longint;
begin
c:=a; a:=b; b:=c;
end;
function min(a,b:longint):longint;
begin
if a>b then min:=b else min:=a;
end;
function max(a,b:longint):longint;
begin
if a>b then max:=a else max:=b;
end;
function gcd(a,b:longint):longint;
begin
if b>a then swap(a,b);
if b= then exit(a) else exit(gcd(b,a mod b));
end;
procedure connect(x,y,z:longint);
begin
inc(l);
pre[l]:=last[x];
last[x]:=l;
other[l]:=y;
len[l]:=z;
end;
procedure dfs(x:longint);
var
q, p :longint;
begin
flag[x]:=true;
q:=last[x];
while q<> do
begin
p:=other[q];
if len[q]= then father[p]:=x;
if not flag[p] then
begin
flag[p]:=true;
size[p]:=size[x]+len[q];
key[p]:=key[x];
dfs(p);
end else
begin
inc(g[]);
g[g[]]:=abs(size[x]+len[q]-size[p]);
if g[g[]]= then dec(g[]);
end;
q:=pre[q];
end;
end;
procedure init;
var
i :longint;
x, y :longint;
begin
read(n,m);
for i:= to m do
begin
read(x,y);
connect(x,y,);
connect(y,x,-);
end;
for i:= to n do father[i]:=-;
for i:= to n do if not flag[i] then dfs(i);
end;
procedure main;
var
i :longint;
begin
if g[]= then
begin
fillchar(flag,sizeof(flag),false);
for i:= to n do if (father[i]=-) and (key[i]=) then
begin
key[i]:=i;
dfs(i);
end;
for i:= to n do tmax[i]:=-maxlongint;
for i:= to n do tmin[i]:=maxlongint;
for i:= to n do
begin
tmax[key[i]]:=max(tmax[key[i]],size[i]);
tmin[key[i]]:=min(tmin[key[i]],size[i]);
end;
for i:= to n do if tmin[i]<>maxlongint then inc(ans1,tmax[i]-tmin[i]+);
if ans1< then
begin
writeln(-,' ',-);
exit;
end else
begin
writeln(ans1,' ',);
exit;
end;
end else
begin
ans1:=g[];
for i:= to g[] do
ans1:=gcd(ans1,g[i]);
if ans1< then
begin
writeln(-,' ',-);
exit;
end else
begin
ans2:=;
for i:= to ans1 do
if ans1 mod i= then
begin
ans2:=i;
break;
end;
if ans2= then ans2:=ans1;
writeln(ans1,' ',ans2);
end;
end;
end;
begin
init;
main;
end.
bzoj 1064 图论的更多相关文章
- BZOJ 1064: [Noi2008]假面舞会(dfs + 图论好题!)
http://www.lydsy.com/JudgeOnline/problem.php?id=1064 题意: 思路: 考虑以下几种情况: ①无环并且是树: 无环的话就是树结构了,树结构的话想一下就 ...
- bzoj 1064 假面舞会 图论??+dfs
有两种情况需要考虑 1.链:可以发现对最终的k没有影响 2.环:如果是真环(即1->2->3->4->1),可以看出所有可行解一定是该环的因数 假环呢??(1->2-&g ...
- BZOJ 1064 假面舞会(NOI2008) DFS判环
此题,回想Sunshinezff学长给我们出的模拟题,原题啊有木有!!此处吐槽Sunshinezff爷出题不人道!! 不过也感谢Sunshinezff学长的帮助,我才能做出来.. 1064: [Noi ...
- bzoj 1064
题意:戳这里 思路:很明显是一个图论模型.. 就两种图形: 1.图中存在环,那么就是所有环的gcd为最大答案.gcd的大于3的最小约数为最小答案 2.不存在环,那么是每个弱连通块的最长链之和为最大答案 ...
- [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]假面舞会
题目大意:n个人,k种假面,每人戴一种,戴第i种的可以看见第i+1种,戴第k种的可以看见第1种,给出m条关系表示一个人可以看到另一个人,问k可能的最大值和最小值.(n<=100,000,m< ...
- bzoj 1064 noi2008 假面舞会题解
莫名其妙的变成了我们的noip互测题... 其实这题思想还是比较简单的,只是分类不好分而已 其实就是一个dfs的事 首先,非常明显,原题目中的所有关系可以抽象成一个图(这是...显而易见的吧...) ...
随机推荐
- 用travis-ci编译android版nodejs
第一步: fork 第二步: 添加.travis.yml 在repository根目录添加.travis.yml文件,在其中添加以下内容. language: c before_install: - ...
- 剑指offer-矩形覆盖10
题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? # -*- coding:utf-8 -*- class S ...
- Tensorflow多线程输入数据处理框架
Tensorflow提供了一系列的对图像进行预处理的方法,但是复杂的预处理过程会减慢整个训练过程,所以,为了避免图像的预处理成为训练神经网络效率的瓶颈,Tensorflow提供了多线程处理输入数据的框 ...
- lintcode-110-最小路径和
110-最小路径和 给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径. 注意事项 你在同一时间只能向下或者向右移动一步 样例 标签 动态规划 思路 使用动态规划,用二 ...
- lincode-58-四数之和
58-四数之和 给一个包含n个数的整数数组S,在S中找到所有使得和为给定整数target的四元组(a, b, c, d). 注意事项 四元组(a, b, c, d)中,需要满足a <= b &l ...
- [剑指Offer] 36.两个链表的第一个公共结点
题目描述 输入两个链表,找出它们的第一个公共结点. [思路]找出两个链表的长度,然后让长的走两个链表的长度差,然后再一起走(因为两个链表用公共的尾部). /* struct ListNode { in ...
- 大并发量订单处理的 KafKa部署
大并发量订单处理的 KafKa部署总结 今天要介绍的是消息中间件KafKa,应该说是一个很牛的中间件吧,背靠Apache 与很多有名的中间件搭配起来用效果更好哦 ,为什么不用RabbitMQ,因为公司 ...
- BZOJ3522 POI2014HOT-Hotels(树形dp)
分两种情况.三点两两lca相同:在三点的lca处对其统计即可,显然其离lca距离应相同:某点在另两点lca的子树外部:对每个点统计出与其距离x的点有多少个即可. 可以长链剖分做到线性,当然不会. #i ...
- HDU 6208 The Dominator of Strings(AC自动机)
The Dominator of Strings Time Limit: 3000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java ...
- 周记【距gdoi:96天】
倒计时从三位数变成了两位数. 然后这周还是很不知道怎么说,经常写一道题写两天.但是总算把后缀数组写完了,也整理完了. 然后周末都不知道干了什么周末就过去了.无聊看了两道省选题发现都是不会做系列,看了以 ...