bzoj3955
首先,最短路不同的两辆车一定不会发生堵塞
对于最短路相同的点,我们把属于最短路径上的边拎出来建图跑最大流即可
然后我TLE了……
因为很明显建出来图很大,而真正流的流量很小
普通的初始标号都是0的sap在增广的时候编号会非常慢
运用fanhq博客里的做法,先用dfs计算图的标号O(m+n),然后再跑sap就跑得飞起了
const inf=;
type node=record
po,next,flow:longint;
end;
point=record
loc,num:longint;
end;
way=record
po,next,num:longint;
end; var w:array[..] of way;
e:array[..] of node;
h:array[..] of point;
v:array[..] of boolean;
wh,d,a,cur,hi,pre,p,q,numh:array[..] of longint;
ans,j,i,len,n,m,t,c,x,y,z:longint; procedure swap(var a,b:point);
var c:point;
begin
c:=a;
a:=b;
b:=c;
end; procedure sift(i:longint);
var j,x,y:longint;
begin
j:=i shl ;
while j<=t do
begin
if (j<t) and (h[j].num>h[j+].num) then inc(j);
if h[i].num>h[j].num then
begin
x:=h[i].loc;
y:=h[j].loc;
wh[x]:=j;
wh[y]:=i;
swap(h[i],h[j]);
i:=j;
j:=j shl ;
end
else break;
end;
end; procedure up(i:longint);
var j,x,y:longint;
begin
j:=i shr ;
while j> do
begin
if h[i].num<h[j].num then
begin
x:=h[i].loc;
y:=h[j].loc;
wh[x]:=j;
wh[y]:=i;
swap(h[i],h[j]);
i:=j;
j:=j shr ;
end
else break;
end;
end; procedure dij;
var i,k,x,y:longint;
begin
t:=n;
for i:= to n do
begin
if i= then d[i]:= else d[i]:=inf;
wh[i]:=i;
h[i].num:=d[i];
h[i].loc:=i;
end;
for k:= to n- do
begin
x:=h[].loc;
wh[h[t].loc]:=;
swap(h[],h[t]);
dec(t);
sift();
i:=q[x];
while i<> do
begin
y:=w[i].po;
if d[x]+w[i].num<d[y] then
begin
d[y]:=d[x]+w[i].num;
h[wh[y]].num:=d[y];
up(wh[y]);
end;
i:=w[i].next;
end;
end;
end; function cmp(i,j:longint):boolean;
begin
if d[i]=d[j] then exit(i<j);
exit(d[i]<d[j]);
end; procedure sort(l,r:longint);
var i,j,x,y:longint;
begin
i:=l;
j:=r;
x:=a[(l+r) shr ];
repeat
while cmp(a[i],x) do inc(i);
while cmp(x,a[j]) do dec(j);
if not(i>j) then
begin
y:=a[i]; a[i]:=a[j]; a[j]:=y;
inc(i);
dec(j);
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r)
end; procedure add(x,y,f:longint);
begin
inc(len);
e[len].po:=y;
e[len].flow:=f;
e[len].next:=p[x];
p[x]:=len;
end; procedure build(x,y,f:longint);
begin
add(x,y,f);
add(y,x,);
end; procedure ins(x,y,z:longint);
begin
inc(len);
w[len].po:=y;
w[len].num:=z;
w[len].next:=q[x];
q[x]:=len;
end; function sap(lim:longint):longint;
var i,j,u,tmp,q:longint;
begin
u:=; sap:=;
while hi[]<n+ do
begin
i:=cur[u];
while i<>- do
begin
j:=e[i].po;
if (e[i].flow>) and (hi[u]=hi[j]+) then
begin
pre[j]:=u;
cur[u]:=i;
u:=j;
if u= then
begin
inc(sap);
if sap=lim then exit;
while u<> do
begin
u:=pre[u];
j:=cur[u];
dec(e[j].flow);
inc(e[j xor ].flow);
end;
end;
break;
end;
i:=e[i].next;
end;
if i=- then
begin
dec(numh[hi[u]]);
if numh[hi[u]]= then break;
tmp:=n;
q:=-;
i:=p[u];
while i<>- do
begin
j:=e[i].po;
if e[i].flow> then
if hi[j]<tmp then
begin
q:=i;
tmp:=hi[j];
end;
i:=e[i].next;
end;
cur[u]:=q;
hi[u]:=tmp+;
inc(numh[hi[u]]);
if u<> then u:=pre[u];
end;
end;
end; procedure dfs(x:longint);
var tmp,i,y,q:longint;
begin
if x= then
begin
hi[]:=;
inc(numh[]);
exit;
end;
v[x]:=true;
tmp:=n;
q:=-;
i:=p[x];
while i<>- do
begin
y:=e[i].po;
if e[i].flow> then
begin
if not v[y] then dfs(y);
if hi[y]<tmp then
begin
tmp:=hi[y];
q:=i;
end;
end;
i:=e[i].next;
end;
cur[x]:=q;
hi[x]:=tmp+;
inc(numh[hi[x]]);
end; procedure work(l,r:longint);
var i,j:longint;
begin
len:=-;
fillchar(p,sizeof(p),);
for i:= to n do
begin
j:=q[i];
while j<> do
begin
y:=w[j].po;
if d[i]+w[j].num=d[y] then build(y,i,);
j:=w[j].next;
end;
end;
i:=l;
while i<=r do
begin
j:=i+;
while (j<=r) and (a[j]=a[i]) do inc(j);
build(,a[i],j-i);
i:=j;
end;
fillchar(numh,sizeof(numh),);
fillchar(v,sizeof(v),false);
dfs();
if hi[]<n+ then
ans:=ans+sap(r-l+);
end; begin
readln(n,m,c);
for i:= to m do
begin
readln(x,y,z);
ins(x,y,z);
ins(y,x,z);
end;
dij;
for i:= to c do
read(a[i]);
sort(,c);
i:=;
while i<=c do
begin
j:=i+;
while (d[a[i]]=d[a[j]]) and (j<=c) do inc(j);
if j=i+ then inc(ans)
else if a[i]= then inc(ans,j-i)
else work(i,j-);
i:=j;
end;
writeln(ans);
end.
bzoj3955的更多相关文章
- [bzoj3955] [WF2013]Surely You Congest
首先最短路长度不同的人肯定不会冲突. 对于最短路长度相同的人,跑个最大流就行了..当然只有一个人就不用跑了 看起来会T得很惨..但dinic在单位网络里是O(m*n^0.5)的... #include ...
随机推荐
- jquery插件——图片放大器
用到了JQzoom插件,可以使图片实现放大效果
- Learn know more about big data
As we all know,we are in a big data age now."Every sword has two slides",as a ITer,we shou ...
- struts2传map到前台出现的问题
后台打印出的错: 2016-08-16 13:42:52.652 WARN org.apache.struts2.json.JSONWriter - JavaScript doesn't s ...
- java 回传参数
通过 new 创建的对象可以实现回传,如数组:自定义类对象里的参数. [数组方式] public static void main(String[] args) { try { int [] amou ...
- FZU 2016 summer train I. Approximating a Constant Range 单调队列
题目链接: 题目 I. Approximating a Constant Range time limit per test:2 seconds memory limit per test:256 m ...
- phonegap file操作
phonegap中,有时候需要操作到手机中的文件,这个时候就需要用到phonegap官方提供的插件 file ,英文好的可以直接参考官方文档 首先是安装插件:(需要phonegap 3.0 以上,不止 ...
- oracle 字符集
---- 在国内外大中型数据库管理系统中,把ORACLE作为数据库管理平台的用户比较多.ORACLE 不论是数据库管理能力还是安全性都是无可非议的,但是,它在汉字信息的显示方面着实给中国用户带来不少麻 ...
- PhotoshopCS4轻松将PSD分层导出为Png分层
大家在网上都下载过PSD分层素材,有时候想把素材分层导出,以往做法是一层一层导出,可是这样效率太低,其实利用PS自带功能可以轻松导出PNG分层. 我们先打开一个PSD文件. 文件有7个图层,分 ...
- java poi导出EXCEL xls文件代码
String _currentPage = request.getParameter("currentPage"); Integer currentPage = 0; if(_cu ...
- HDU 3038 How Many Answers Are Wrong(带权并查集)
太坑人了啊,读入数据a,b,s的时候,我刚开始s用的%lld,给我WA. 实在找不到错误啊,后来不知怎么地突然有个想法,改成%I64d,竟然AC了 思路:我建立一个sum数组,设i的父亲为fa,sum ...