zoukankan      html  css  js  c++  java
  • bzoj2535 2109

    做过4010这题其实就水了

    把图反向之后直接拓扑排序做即可,我们可以用链表来优化

    每个航班的最小起飞序号就相当于在反向图中不用这个点最迟到哪

      1 type node=record
      2        po,next:longint;
      3      end;
      4 
      5 var e:array[0..10010] of node;
      6     ans,p,h,suc,du,d,a:array[0..2010] of longint;
      7     i,x,y,n,m:longint;
      8 
      9 procedure add(x,y:longint);
     10   begin
     11     e[i].po:=y;
     12     e[i].next:=p[x];
     13     p[x]:=i;
     14   end;
     15 
     16 procedure merge(x,y:longint);
     17   begin
     18     if h[x]=0 then h[x]:=h[y]
     19     else begin
     20       x:=h[x];
     21       while suc[x]<>0 do x:=suc[x];
     22       suc[x]:=h[y];
     23     end;
     24   end;
     25 
     26 function min(wh:longint):longint;
     27   var i,x,y,t,b:longint;
     28   begin
     29     for i:=1 to n do
     30     begin
     31       du[i]:=d[i];
     32       h[i]:=0;
     33     end;
     34     for i:=1 to n do
     35       if (i<>wh) and (d[i]=0) then
     36       begin
     37         suc[i]:=h[a[i]];
     38         h[a[i]]:=i;
     39       end;
     40     t:=n;
     41     while t>0 do
     42     begin
     43       x:=h[t];
     44       if x=0 then exit(t);
     45       h[t]:=suc[h[t]];
     46       i:=p[x];
     47       while i<>0 do
     48       begin
     49         y:=e[i].po;
     50         dec(du[y]);
     51         if (y<>wh) and (du[y]=0) then
     52         begin
     53           if a[y]<t then b:=a[y]
     54           else b:=t;
     55           suc[y]:=h[b];
     56           h[b]:=y;
     57         end;
     58         i:=e[i].next;
     59       end;
     60       merge(t-1,t);
     61       dec(t);
     62     end;
     63     exit(0);
     64   end;
     65 
     66 procedure work1;
     67   var i,x,y,t,b:longint;
     68   begin
     69     for i:=1 to n do
     70     begin
     71       du[i]:=d[i];
     72       h[i]:=0;
     73     end;
     74     for i:=1 to n do
     75       if d[i]=0 then
     76       begin
     77         suc[i]:=h[a[i]];
     78         h[a[i]]:=i;
     79       end;
     80     t:=n;
     81     while t>0 do
     82     begin
     83       x:=h[t];
     84       ans[t]:=x;
     85       h[t]:=suc[h[t]];
     86       i:=p[x];
     87       while i<>0 do
     88       begin
     89         y:=e[i].po;
     90         dec(du[y]);
     91         if du[y]=0 then
     92         begin
     93           if a[y]<t then b:=a[y]
     94           else b:=t;
     95           suc[y]:=h[b];
     96           h[b]:=y;
     97         end;
     98         i:=e[i].next;
     99       end;
    100       merge(t-1,t);
    101       dec(t);
    102     end;
    103     for i:=1 to n-1 do
    104       write(ans[i],' ');
    105     writeln(ans[n]);
    106   end;
    107 
    108 procedure work2;
    109   var i:longint;
    110   begin
    111     for i:=1 to n-1 do
    112       write(min(i),' ');
    113     writeln(min(n));
    114   end;
    115 
    116 begin
    117   readln(n,m);
    118   for i:=1 to n do
    119   begin
    120     read(a[i]);
    121     if a[i]>n then a[i]:=n;
    122   end;
    123   for i:=1 to m do
    124   begin
    125     readln(x,y);
    126     add(y,x);
    127     inc(d[x]);
    128   end;
    129   work1;
    130   work2;
    131 end.
    View Code
  • 相关阅读:
    hdu 4614 线段树 二分
    cf 1066d 思维 二分
    lca 最大生成树 逆向思维 2018 徐州赛区网络预赛j
    rmq学习
    hdu 5692 dfs序 线段树
    dfs序介绍
    poj 3321 dfs序 树状数组 前向星
    cf 1060d 思维贪心
    【PAT甲级】1126 Eulerian Path (25分)
    【PAT甲级】1125 Chain the Ropes (25分)
  • 原文地址:https://www.cnblogs.com/phile/p/4609628.html
Copyright © 2011-2022 走看看