标签:des style blog http color os
【数据范围】
对于30%数据:n≤10;
对于60%数据:n≤500;
对于100%数据:n≤2,000,m≤10,000。
不错的一道贪心。
首先看第一问,要求输出一个可行的方案。
只需要倒过来,也就是如果i必须在j前面,那么从j向i连边。然后每一个点的初始权值wi表示最晚可以什么时候进,就是那个最晚的时间ki,然后按拓扑序跑一遍,用每一个点i的wi-1去更新其后继j的wj值,(取min)这样就求出了每一个点的可能的最晚时间。
然后排个序,从小到大输出即可。(呵呵!保证了有合法序列真好)。
第一问的贪心还是很好想的,至于证明的话:考虑每一个点让它尽可能的跑最晚的时间在有可行解的情况下肯定是能够跑出可行解的。
第二问就比第一问难了。
对于一个点i,在不考虑别的点的情况下,肯定答案就是1了,现在考虑哪些情况会让它不得不推后。
1:其前驱一定是要在前面的。
2:有些没有被安排在i的前面的点j的wj小于i当前的时间。
3:这种情况就比较奇葩了。就是虽然现在的j的限制是满足的,但是加上之前没有放在i前面的点之后就悲剧了。
对于第一种情况bfs就够了。
对于第二种情况和第三种情况,pi,表示现在求i的最小进入时间,(初始由bfs得出)然后从小到大扫描。
第二种情况:判断wj是否<=pi,如果是,则++pi。
第三种情况:看当前累积的放在i后面的个数和已经在i前面的个数加起来是不是可以满足j的限制,如果可以,当然继续丢i后面,否则就把j前面的没有在i前面的全部放在i前面。
这样,问题就完美解决了。
代码:
1 const maxn=2000+10;maxm=10000+10; 2 type node=record 3 go,next:longint; 4 end; 5 var head,deg,inp,a,b,q:array[0..maxn] of longint; 6 h,t,i,n,m,x,y:longint; 7 e:array[0..maxm] of node; 8 procedure sort(l,r:longint); 9 var i,j,m,temp:longint; 10 begin 11 i:=l;j:=r;x:=a[(i+j)>>1]; 12 repeat 13 while b[a[i]]<b[x] do inc(i); 14 while b[a[j]]>b[x] do dec(j); 15 if i<=j then 16 begin 17 y:=a[i];a[i]:=a[j];a[j]:=y; 18 inc(i);dec(j); 19 end; 20 until i>j; 21 if i<r then sort(i,r); 22 if j>l then sort(l,j); 23 end; 24 procedure init; 25 begin 26 readln(n,m); 27 for i:=1 to n do 28 begin 29 read(b[i]); 30 b[i]:=n-b[i]; 31 a[i]:=i; 32 end; 33 sort(1,n); 34 for i:=1 to m do 35 begin 36 readln(y,x); 37 e[i].go:=y;inc(inp[y]);e[i].next:=head[x];head[x]:=i; 38 end; 39 end; 40 procedure work(x:longint); 41 var i,p,j,u,v:longint; 42 begin 43 deg:=inp; 44 h:=0;t:=0;p:=1; 45 for i:=1 to n do 46 begin 47 while (p<=n) and (b[a[p]]<i) do 48 begin 49 v:=a[p]; 50 if (deg[v]=0) and (v<>x) then 51 begin 52 inc(t);q[t]:=v; 53 end; 54 inc(p); 55 end; 56 if h<t then 57 begin 58 inc(h); 59 u:=q[h]; 60 j:=head[u]; 61 while j<>0 do 62 begin 63 v:=e[j].go; 64 dec(deg[v]); 65 if (deg[v]=0) and (v<>x) and (b[v]<i) then 66 begin 67 inc(t);q[t]:=v; 68 end; 69 j:=e[j].next; 70 end; 71 end 72 else exit; 73 end; 74 end; 75 procedure main; 76 begin 77 work(0); 78 for i:=t downto 1 do write(q[i],‘ ‘);writeln; 79 for i:=1 to n do 80 begin 81 work(i); 82 write(n-t,‘ ‘); 83 end; 84 end; 85 begin 86 assign(input,‘input.txt‘);assign(output,‘output.txt‘); 87 reset(input);rewrite(output); 88 init; 89 main; 90 close(input);close(output); 91 end.
标签:des style blog http color os
原文地址:http://www.cnblogs.com/zyfzyf/p/3855373.html