zoukankan      html  css  js  c++  java
  • bzoj1638[Usaco2007 Mar]Cow Traffic (first code)

    求出走到每个点有的方法数a[i],再求出每个点到终点的方法数b[i]。 每条边走的 次数=a[u[i]]*b[v[i]] 。 可以用类spfa按照拓扑序求a[i],把入度为0的点都入栈然后a[e[j]]=a[e[j]]+a[q[h]] 求b[i]可以把边反向重新spfa一遍。 [toggle Title="code "] [pascal] uses math; var u,v,rud,next,e,head:Array[1..50000]of longint; f,ff:array[1..50000]of int64; ans:int64; i,j,n,m,ee,h,t:longint; a:array[1..100000]of longint; procedure swap(var aa,bb:longint); var tt:longint; begin tt:=aa;aa:=bb;bb:=tt; end; procedure add(u,v:longint); begin inc(ee);next[ee]:=head[u];head[u]:=ee;e[ee]:=v; end; begin readln(n,m); for i:=1 to m do begin readln(u[i],v[i]); if u[i]>v[i] then swap(u[i],v[i]); add(u[i],v[i]); inc(rud[v[i]]); end; h:=1; t:=0; for i:=1 to n do if rud[i]=0 then begin inc(t);a[t]:=i;f[i]:=1; end; while h<=t do begin j:=head[a[h]]; while j<>0 do begin f[e[j]]:=f[e[j]]+f[a[h]]; dec(rud[e[j]]); if rud[e[j]]=0 then begin inc(t);a[t]:=e[j]; end; j:=next[j]; end; inc(h); end; fillchar(head,sizeof(head),0);ee:=0; fillchar(rud,sizeof(rud),0); for i:=1 to m do begin add(v[i],u[i]); inc(rud[u[i]]); end; h:=1; t:=0; for i:=1 to n do if rud[i]=0 then begin inc(t);a[t]:=i;ff[i]:=1; end; while h<=t do begin j:=head[a[h]]; while j<>0 do begin ff[e[j]]:=ff[e[j]]+ff[a[h]]; dec(rud[e[j]]); if rud[e[j]]=0 then begin inc(t);a[t]:=e[j]; end; j:=next[j]; end; inc(h); end; for i:=1 to m do if f[u[i]]*ff[v[i]]>ans then ans:=f[u[i]]*ff[v[i]]; writeln(ans); end. [/pascal] [/toggle]
    ------------------------------------------------------------------------- 花有重开日,人无再少年
  • 相关阅读:
    hdu1565 用搜索代替枚举找可能状态或者轮廓线解(较优),参考poj2411
    cf1114D 区间dp基础
    poj2411 状态压缩-铺地板题型-轮廓线解法(最优)
    poj3254 炮兵阵地弱化版,记数类dp
    poj2441状态压缩dp基础
    zoj3471 状态压缩dp基础
    北极通讯网络(最小生成树)
    黑暗城堡(生成树)
    关押罪犯(并查集)
    搭配购买(并查集+0/1背包)
  • 原文地址:https://www.cnblogs.com/lbz007oi/p/3067345.html
Copyright © 2011-2022 走看看