我们根据能否看见建图,有向图边权设成1,然后我们转成无向图,

对于每条有向边连一条反边,边权是-1,然后从每个块中任意一个点开始

dfs,每个点有一个值,经过一条边到另一个点之后,用原来的点值和边权

更新新的点的点值,那么如果我们访问到了一个原来已经走过的点,那么我们

找到了一个环(可能是非环,就是一个点出两条有向边,然后又交在一点了),由于

数据是合法的,所以这样的非环的现在应该更新成的点值和原有的点值相等,如果不相等

的话,取差值的绝对值,就是这个环的长度。

那么我们对于所有块,每个块的环的长度都是种类数的倍数,所以取gcd就好了

还有一种情况就是没有环,全都是以链的形式存在的,对于这种形式,我们每个块

染色,然后找到每个块中点值最大的最小的差值就是最长链的长度。

无解的情况比较容易讨论,在此不再赘述。

/**************************************************************Problem: 1064User: BLADEVILLanguage: PascalResult: AcceptedTime:284 msMemory:34596 kb
****************************************************************/{$M 65536000}
//By BLADEVIL
varn, m                            :longint;pre, other, len                 :array[0..2000020] of longint;last                            :array[0..100010] of longint;l                               :longint;flag                            :array[0..100010] of boolean;size, father, key, tmin, tmax   :array[0..100010] of longint;g                               :array[0..2000100] of longint;ans1, ans2                      :longint;procedure swap(var a,b:longint);
varc                               :longint;
beginc:=a; a:=b; b:=c;
end;function min(a,b:longint):longint;
beginif a>b then min:=b else min:=a;
end;function max(a,b:longint):longint;
beginif a>b then max:=a else max:=b;
end;function gcd(a,b:longint):longint;
beginif b>a then swap(a,b);if b=0 then exit(a) else exit(gcd(b,a mod b));
end;procedure connect(x,y,z:longint);
begininc(l);pre[l]:=last[x];last[x]:=l;other[l]:=y;len[l]:=z;
end;procedure dfs(x:longint);
varq, p                            :longint;
beginflag[x]:=true;q:=last[x];while q<>0 dobeginp:=other[q];if len[q]=1 then father[p]:=x;if not flag[p] thenbeginflag[p]:=true;size[p]:=size[x]+len[q];key[p]:=key[x];dfs(p);end elsebegininc(g[0]);g[g[0]]:=abs(size[x]+len[q]-size[p]);if g[g[0]]=0 then dec(g[0]);end;q:=pre[q];end;
end;procedure init;
vari                               :longint;x, y                            :longint;
beginread(n,m);for i:=1 to m dobeginread(x,y);connect(x,y,1);connect(y,x,-1);end;for i:=1 to n do father[i]:=-1;for i:=1 to n do if not flag[i] then dfs(i);
end;procedure main;
vari                               :longint;
beginif g[0]=0 thenbeginfillchar(flag,sizeof(flag),false);for i:=1 to n do if (father[i]=-1) and (key[i]=0) thenbeginkey[i]:=i;dfs(i);end;for i:=1 to n do tmax[i]:=-maxlongint;for i:=1 to n do tmin[i]:=maxlongint;for i:=1 to n dobegintmax[key[i]]:=max(tmax[key[i]],size[i]);tmin[key[i]]:=min(tmin[key[i]],size[i]);end;for i:=1 to n do if tmin[i]<>maxlongint then inc(ans1,tmax[i]-tmin[i]+1);if ans1<3 thenbeginwriteln(-1,' ',-1);exit;end elsebeginwriteln(ans1,' ',3);exit;end;end elsebeginans1:=g[1];for i:=2 to g[0] doans1:=gcd(ans1,g[i]);if ans1<3 thenbeginwriteln(-1,' ',-1);exit;end elsebeginans2:=0;for i:=3 to ans1 doif ans1 mod i=0 thenbeginans2:=i;break;end;if ans2=0 then ans2:=ans1;writeln(ans1,' ',ans2);end;end;
end;begininit;main;
end.

转载于:https://www.cnblogs.com/BLADEVIL/p/3489845.html

bzoj 1064 图论相关推荐

  1. [BZOJ 1064][NOI 2008]假面舞会(图论+BFS)

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=1064 题目大意 给一个有向图染色,一个点的后继的颜色必须全部相同,问最多多少种颜色,最少多 ...

  2. BZOJ 1064 假面舞会(图论-连通分量)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1064 题意:一年一度的假面舞会又开始了,栋栋也 兴致勃勃的参加了今年的舞会.今年的面具都 ...

  3. BZOJ 1064 假面舞会

    1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MB Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年 ...

  4. bzoj 1064: [Noi2008]假面舞会(DFS)

    1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2240  Solved: 1083 [Submit][Sta ...

  5. [BZOJ]1064 [NOI2008] 假面舞会 dfs判环

    1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2160  Solved: 1047 [Submit][Sta ...

  6. 【BZOJ 1064】【NOI 2008】假面舞会

    Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办 ...

  7. bzoj 1064 noi2008 假面舞会题解

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

  8. 图论 公约数 找环和链 BZOJ [NOI2008 假面舞会]

    BZOJ 1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1655  Solved: 798 [Submit] ...

  9. 菜谱小程序_喝鸡尾酒食谱应用程序

    菜谱小程序 The process of making a useful drink library 制作有用的饮料库的过程 Do you ever try a drink at a bar and ...

最新文章

  1. java数据结构排序实验报告_java数据结构与算法之插入排序详解
  2. 虚拟机:请问我刚刚回收的对象是干垃圾还是湿垃圾?|文末送书
  3. 【AI视野·今日CV 计算机视觉论文速览 第194期】Mon, 10 May 2021
  4. Python使用matplotlib进行可视化时精确控制图例位置
  5. Redis五大数据类型String、Hash、List、Set、ZSet
  6. 问一个 TCP 连接可以发多少个 HTTP 请求?
  7. PCBA电路板中电容MLCC失效分析-应力测试作业指导
  8. 金蝶kis商贸采购单商品代码_金蝶KIS商贸版操作明细
  9. word找不到橡皮擦工具
  10. Java HotSpot(TM) 64-Bit Server VM warning:
  11. android音频系统(4):AudioService之音量管理
  12. 鸿蒙系统有没有方舟编译器,华为鸿蒙系统终于来了! 首款方舟编译器应用正式上架: 鸿蒙OS可用...
  13. 什么是 SHA 加密? SHA-1 与 SHA-2
  14. 台达PLC与单片机的通讯
  15. strip()函数用法简介
  16. 亚马逊广告授权流程说明
  17. CSRF攻击实验 ——合天网安实验室学习笔记
  18. python matplotlib绘制gif动图以及保存
  19. 还不知道图片去水印怎么去?看看这篇文章就知道了
  20. SpringBoot在使用Security和JWT时,应当怎么放行图片等静态资源#访问静态资源#静态资源放行#报错401

热门文章

  1. iOS APP与APP之间的通信方式
  2. [TJOI2013]最长上升子序列
  3. SSH远程管理(用户登录控制及密码验证)
  4. 如何用技术搞好英俄翻译?
  5. Ubuntu里的vi编辑器不好用的解决办法
  6. 深入讨论PHP5对象复制技术
  7. CodeChef TWOROADS(计算几何+拉格朗日乘数法)
  8. JQuery实现父级选择器(广告实现)
  9. 修复“-bash: locate: command not found”
  10. 20145209 2016-2017-2 《Java程序设计》第7周学习总结