【题目大意】:

一共有n个人,每个人都带着面具,然后一共有k类面具,并且知道k>=3。只有带第i-1类面具的人能看到带第i类面具的人,带第k类面具的人能看到带第1类面具的人。告诉你m个信息,谁能看到谁。问你k的最大值和最小值。

【题目分析】:

作为练习考的NOI 2008 day1,据说是最简单的一个题……花了我三个小时想、写还有调……绝对IMBA~~

这个题变态就变态在如果一个人能看到两个人,那么这两个人就必须带同一类面具,或是两个人能看到同一个人,那么这两个人也一定带同一类面具。这样就让找等价类变得很麻烦了。

那么我们就从简单的分析起,如果不存在上述情况,也就是一个人就是一个等价类,那么这个图就是环和树。对于环,能让它满足的k就是这个环的长度和它的所有约数。如果是树的话,任意长度都好,所以有环就不用考虑树~

那么就是找环就好,所有环的长度的最大公约数就是最大的解,然后枚举3到这个gcd,就能得到最小的。如果都是树,那么最小就是3,最大就是所有的树上最长链的长度加在一起。

现在回到原来的问题,等价类怎么办~最开始想过并查集,但是发现特别容易悲剧,所以后来想到了改成无向图,正边和反边的权值分别为1和-1,这样找环的时候,如果找回来就没事了,说明与之前的并不矛盾,找到了矛盾(就是找到标号不同了),就是一个这个图的等价图的一个环。这就简单多了,于是这个问题就解决了……

P.s. 因为考了太多的东西,也不好分类,只好写了个图论综合~orz NOI 2008的这题的出题人……

【代码】:

{$M 65536000} program party; const inf=1000000; type ntype=record data,next,c,op:longint; flag:boolean; end; var node:array[1..1000001] of ntype; g,num,co,circle,cmax,cmin:array[1..100000] of longint; v:array[1..100000] of boolean; n,m,i,p,tot,color,x,y,min,ans1,ans2:longint; flag:boolean; procedure link(x,y,c:longint); begin inc(tot); node[tot].data:=y; node[tot].c:=c; node[tot].flag:=false; node[tot].next:=g[x]; g[x]:=tot; if odd(tot) then node[tot].op:=tot+1 else node[tot].op:=tot-1; end; function gcd(x,y:longint):longint; begin if y=0 then exit(x); exit(gcd(y,x mod y)); end; procedure dfs(x,now:longint); var p:longint; begin num[x]:=now; v[x]:=true; p:=g[x]; while p<>0 do begin if not node[p].flag then begin node[p].flag:=true; node[node[p].op].flag:=true; if not v[node[p].data] then dfs(node[p].data,now+node[p].c) else begin if now+node[p].c-num[node[p].data]<>0 then begin inc(tot); circle[tot]:=abs(now+node[p].c-num[node[p].data]); end; end; end; p:=node[p].next; end; end; procedure dfs2(x,now:longint); var p:longint; begin v[x]:=true; num[x]:=now; p:=g[x]; while p<>0 do begin if not node[p].flag then begin node[p].flag:=true; node[node[p].op].flag:=true; dfs2(node[p].data,now+node[p].c); end; p:=node[p].next; end; end; procedure fill(x:longint); var p:longint; begin co[x]:=color; p:=g[x]; while p<>0 do begin if co[node[p].data]=0 then fill(node[p].data); p:=node[p].next; end; end; begin assign(input,'party.in'); assign(output,'party.out'); reset(input); rewrite(output); readln(n,m); for i:=1 to m do begin readln(x,y); link(x,y,1); link(y,x,-1); end; tot:=0; for i:=1 to n do if not v[i] then dfs(i,1); min:=circle[1]; ans1:=circle[1]; for i:=2 to tot do begin ans1:=gcd(ans1,circle[i]); if min>circle[i] then min:=circle[i]; end; for ans2:=3 to min do begin flag:=false; for i:=1 to tot do if circle[i] mod ans2<>0 then begin flag:=true; break; end; if not flag then break; end; if tot=0 then begin color:=0; for i:=1 to n do if co[i]=0 then begin inc(color); fill(i); cmax[color]:=-inf; cmin[color]:=inf; end; fillchar(v,sizeof(v),0); for i:=1 to n do begin p:=g[i]; while p<>0 do begin node[p].flag:=false; node[node[p].op].flag:=false; p:=node[p].next; end; end; for i:=1 to n do begin if not v[i] then dfs2(i,1); if num[i]>cmax[co[i]] then cmax[co[i]]:=num[i]; if num[i]<cmin[co[i]] then cmin[co[i]]:=num[i]; end; ans1:=0; for i:=1 to color do ans1:=ans1+cmax[i]-cmin[i]+1; if ans1<3 then writeln(-1,' ',-1) else writeln(ans1,' ',3); end else if ans1>=3 then writeln(ans1,' ',ans2) else writeln(-1,' ',-1); close(input); close(output); end.

[NOI 2008]假面舞会(综合图论)相关推荐

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

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

  2. NOI 2008 假面舞会

    如果没有环那么最大的面具的种类为所有联通块最长链之和.最小为3,如果最长链之和<3,则无解: 如果有环找出每个环的结点个数=.=面具种类数为所有环的结点个数的最大公约数x. 为什么呢 一个环1- ...

  3. 【NOI2008】假面舞会(图论,搜索)

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

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

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

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

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

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

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

  7. 【图论 搜索】bzoj1064: [Noi2008]假面舞会

    做到最后发现还是读题比赛:不过还是很好的图论题的 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选 ...

  8. BZOJ 1064 假面舞会

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

  9. BZOJ1064【NOI2008】【假面舞会】

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

最新文章

  1. Zabbix企业应用之服务器硬件信息监控
  2. 网络广告推广浅析网站的外链究竟要如何优化效果才会更好呢?
  3. 傅里叶变换:周期、非周期 与连续、离散
  4. 物联网第一台设备是烤面包机?
  5. mysql写入 cpu飙升_分析MySQL中索引引引发的CPU负载飙升的问题
  6. HDU 4336 概率DP 状压
  7. ZUST蓝桥杯校内选拔赛(java,c)安吉校区
  8. HDU 6182 2017广西邀请赛:A Math Problem
  9. 程序员常用的笔记软件——Typora快捷键
  10. Qt5_自定义处理Windows消息函数
  11. <C++>我用煮粽子的时间拿捏了类和对象中友元的全部形式
  12. CityEngine--comp() operator
  13. ESXI6.7.0 升级到7.0U3f(2022年7月12 更新)
  14. 软件工程毕业论文mysql英文翻译_软件工程专业毕业设计外文文献翻译
  15. AddressBook 地址簿 (电话簿) 访问与修改
  16. @Value(${}) 与@Value(#{}) 区别
  17. 计算机科学导论 -- 第二章 数字系统
  18. JDK11 新特性详解
  19. 客户画像分析无头绪?来试下风险评分与特征的方案与实现
  20. AcWing4399数字母

热门文章

  1. STM32 用串口连接两个板子
  2. hadoop订单项目实战
  3. Hadoop实战记录-目录
  4. 科技公司的域名大战!
  5. Android: 渠道号获取
  6. 任务发布消费中间件 leek 使用教程
  7. 利用无线信号传输的远程红绿灯辨识系统
  8. Mac 超详细入门指南,收藏了!
  9. 使用manifest实现XP风格界面
  10. WLAN适配器的驱动程序可能出现了问题(连不了wifi)解决办法