[NOI 2008]假面舞会(综合图论)
【题目大意】:
一共有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]假面舞会(综合图论)相关推荐
- [BZOJ 1064][NOI 2008]假面舞会(图论+BFS)
题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=1064 题目大意 给一个有向图染色,一个点的后继的颜色必须全部相同,问最多多少种颜色,最少多 ...
- NOI 2008 假面舞会
如果没有环那么最大的面具的种类为所有联通块最长链之和.最小为3,如果最长链之和<3,则无解: 如果有环找出每个环的结点个数=.=面具种类数为所有环的结点个数的最大公约数x. 为什么呢 一个环1- ...
- 【NOI2008】假面舞会(图论,搜索)
题面 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一个自己喜欢的面 具.每个面具都有一个编号 ...
- BZOJ 1064 假面舞会(图论-连通分量)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1064 题意:一年一度的假面舞会又开始了,栋栋也 兴致勃勃的参加了今年的舞会.今年的面具都 ...
- 【BZOJ 1064】【NOI 2008】假面舞会
Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办 ...
- 图论 公约数 找环和链 BZOJ [NOI2008 假面舞会]
BZOJ 1064: [Noi2008]假面舞会 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1655 Solved: 798 [Submit] ...
- 【图论 搜索】bzoj1064: [Noi2008]假面舞会
做到最后发现还是读题比赛:不过还是很好的图论题的 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选 ...
- BZOJ 1064 假面舞会
1064: [Noi2008]假面舞会 Time Limit: 10 Sec Memory Limit: 162 MB Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年 ...
- BZOJ1064【NOI2008】【假面舞会】
BZOJ1064[NOI2008][假面舞会] Description一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 ...
最新文章
- Zabbix企业应用之服务器硬件信息监控
- 网络广告推广浅析网站的外链究竟要如何优化效果才会更好呢?
- 傅里叶变换:周期、非周期 与连续、离散
- 物联网第一台设备是烤面包机?
- mysql写入 cpu飙升_分析MySQL中索引引引发的CPU负载飙升的问题
- HDU 4336 概率DP 状压
- ZUST蓝桥杯校内选拔赛(java,c)安吉校区
- HDU 6182 2017广西邀请赛:A Math Problem
- 程序员常用的笔记软件——Typora快捷键
- Qt5_自定义处理Windows消息函数
- <C++>我用煮粽子的时间拿捏了类和对象中友元的全部形式
- CityEngine--comp() operator
- ESXI6.7.0 升级到7.0U3f(2022年7月12 更新)
- 软件工程毕业论文mysql英文翻译_软件工程专业毕业设计外文文献翻译
- AddressBook 地址簿 (电话簿) 访问与修改
- @Value(${}) 与@Value(#{}) 区别
- 计算机科学导论 -- 第二章 数字系统
- JDK11 新特性详解
- 客户画像分析无头绪?来试下风险评分与特征的方案与实现
- AcWing4399数字母