Milking Order

题意:给出m个描述状态,其中包含若干个边的关系,问最多能取x (x<=m)个状态,使得形成的图没有环。就是说取x个状态,用状态中的关系建边,其中不能有环。

题解:最大化x?和二分答案有点关系。所以首先要二分x,判断是否有环。这个可以用拓扑或者tarjan。我用的是拓扑,判环的依据是队尾t是否等于n,如果不等于n,则一定有环。(只有入度等于1才进队)于是操作就有点复杂了,(我会在程序里标记)。最后因为要字典序最小,要用堆来输出答案。

 var
q,head,next,rd,a,b,id,ans,f:array[..]of longint;
e,i,j,mid,x,y,z,l,r,t,len,n,k,tot,m:longint;
procedure add(x,y:longint);
begin
inc(e);next[e]:=head[x];head[x]:=e; a[e]:=y;id[e]:=i;
end;
function check(mid:longint):boolean; var i,h,tail:longint;
begin
fillchar(rd,sizeof(rd),);
fillchar(q,sizeof(q),);
tail:=; t:=;
for i:= to e do
begin
if id[i]<=mid then
begin
inc(rd[a[i]]);
end;
end; for i:= to n do
if rd[i]= then
begin
inc(t);
inc(tail);
q[tail]:=i;
end;
if tail= then exit(false);
h:=;
while h<tail do
begin
inc(h);
i:=head[q[h]];
while (id[i]>mid)and(i>) do begin i:=next[i]; end;// 判断边是否超过mid while (i>) do
begin
dec(rd[a[i]]);
if rd[a[i]]= then
begin
inc(t);inc(tail);q[tail]:=a[i];
// if mid = then writeln(tail);
end;
i:=next[i];
while (i>)and(id[i]>mid) do i:=next[i]; //同样判断
end;
end; if t=n then exit(true) else exit(false);
end;
procedure make(x:longint);
var now,father,t:longint;
begin
inc(len);
f[len]:=x;
now:=len;
while (now>)and(f[now>>]>f[now]) do
begin
father:=now>>;
t:=f[father];
f[father]:=f[now];
f[now]:=t;
now:=father;
end;
end; function detele:longint;
var fa,son,t:longint;
ss:boolean;
begin
k:=f[];
f[]:=f[len];
dec(len);
fa:=;ss:=false;
while ((fa*<=len)or(fa*+<=len))and(not ss) do
begin
if (fa*+>len) or(f[fa*]<f[fa*+]) then
son:=fa* else son:=fa*+;
if f[fa]>f[son] then
begin
t:=f[fa];
f[fa]:=f[son];
f[son]:=t;
fa:=son;
end
else break;
end;
end; begin
readln(n,m);
for i:= to m do
begin
read(x);
for j:= to x do
begin
read(y);
if j> then begin add(z,y); end;
z:=y;
end;
end;
l:=;r:=m;
while l<=r do//二分答案模板(
begin
mid:=(l+r) div ;
//writeln(l,' ',r);
if check(mid) then l:=mid+ else r:=mid-; end;
l:=l-;//直到这里) fillchar(rd,sizeof(rd),);
for i:= to e do
begin
if id[i]<=l then
begin
inc(rd[a[i]]);
end;
end;
for i:= to n do
begin
if rd[i]= then make(i);//堆操作
end;
tot:=;
while tot<n do
begin
inc(tot);
detele;
write(k,' ');//堆操作
i:=head[k];
while (id[i]>l)and(i>) do i:=next[i];//判断是否大于二分答案的最终答案 while i> do
begin
dec(rd[a[i]]);
if rd[a[i]]= then make(a[i]);
i:=next[i];
while (i>)and(id[i]>mid) do i:=next[i];//也需要判断
end;
end;
end.

Milking Order的更多相关文章

  1. 【二分+拓扑排序】Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348

    目录 Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 MEA ...

  2. BZOJ5280: [Usaco2018 Open]Milking Order(二分+拓扑)

    5280: [Usaco2018 Open]Milking Order Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 123  Solved: 62[ ...

  3. [Usaco2018 Open]Milking Order

    Description Farmer John的N头奶牛(1≤N≤10^5),仍然编号为1-N,正好闲得发慌.因此,她们发展了一个与Farmer John每天早上为她们挤牛奶的时候的排队顺序相关的复杂 ...

  4. [BZOJ5280] [Usaco2018 Open]Milking Order

    Description Farmer John的N头奶牛(1≤N≤105),仍然编号为1…N,正好闲得发慌.因此,她们发展了一个与Farmer John每 天早上为她们挤牛奶的时候的排队顺序相关的复杂 ...

  5. 【杂题1】USACO 2018 Open Contest-练习

    https://www.xoj.red/contests/show/1231 下面会写一些题目的解析什么的,当然不会粘贴题目只是简单提一下 (部分题目简单的题目就不概括了) 其实难度应该前面比较低. ...

  6. codeforce ---A. Milking cows

    A. Milking cows time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  7. 在UPDATE中更新TOP条数据以及UPDATE更新中使用ORDER BY

    正常查询语句中TOP的运用: SELECT TOP 1000 * FROM MP_MemberGrade   随意更新一张表中满足条件的前N条数据: UPDATE TOP (1) MP_Member ...

  8. BZOJ 1391: [Ceoi2008]order [最小割]

    1391: [Ceoi2008]order Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1509  Solved: 460[Submit][Statu ...

  9. Android中的Libraries以及Order and Export的使用。

    1Add JAR 从Eclipse的现有所有工程中,添加jar包到该工程下 2Add External JARs 从Eclipse外的其他的位置,添加jar包到该工程下 3Add Variable 增 ...

随机推荐

  1. vs2017 git到oschina 方法

    vs2017中git基本使用方法: 1.开发环境vs2017,git服务器使用git.oschina.net 2.打开vs2017 创建项目 如果已有项目则: 3.完成后在文件前面会有小锁的图标,说明 ...

  2. springMVC文件上传大小超过限制的问题

    [转自]https://my.oschina.net/ironwill/blog/646762 springMVC是一个非常方便的web层框架,我们使用它的文件上传也非常的方便. 我们通过下面的配置来 ...

  3. webstorm window找不到文件'chrome'

    1.打开webstorm设置: File->Settings->Tools->Web Browsers->更改谷歌浏览器的Path(获取方式:谷歌浏览器的快捷键->右键- ...

  4. canvas制作随机验证码

    看到人家彩色背景的验证码想测试一下: 创建html代码: <canvas id="myCanvas" width="200" height="1 ...

  5. 记录 iOS 各种跳转到系统应用

    MARK ----拨打电话 NSString* phoneVersion = [[UIDevice currentDevice] systemVersion]; if (phoneVersion.fl ...

  6. 绘图驱动-OSD原理2

    转载自:http://blog.pfan.cn/programming/21209.html 现在已经可以通过修改存储单元内容来改变OSD的像素,但还有个关键的问题是如何根据需要来进行操作,即如何将某 ...

  7. DIAView组态软件笔记

    1.为了节省成本,我们往往会在PLC将多个开关量整合到同一个word中,这样关联的变量可以从原有的16个变成现在的一个.这样做带来的麻烦就是需要我们在脚本中自己来解析出数据,通过对2求余(mod 2) ...

  8. oracle database 9i/10g/11g 编程艺术 源代码下载

    背景 在找这本书的源码,搜到提供的都是需要C币下载的.比较固执(其实是穷). 在这本书的前言中提到源代码可以在 www.appress.com 上下载. 下面是该书在该网站上的链接: https:// ...

  9. Jquery实现简单图片轮播

    html代码: <div class="show"> <div class="left"> <div class="sh ...

  10. 本地打jar包到本地的Maven出库

    1.命令行输入 mvn install:install-file -DgroupId=jar包的groupId -DartifactId=jar包的artifactId -Dversion=jar包的 ...