首先,最短路不同的两辆车一定不会发生堵塞

对于最短路相同的点,我们把属于最短路径上的边拎出来建图跑最大流即可

然后我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的更多相关文章

  1. [bzoj3955] [WF2013]Surely You Congest

    首先最短路长度不同的人肯定不会冲突. 对于最短路长度相同的人,跑个最大流就行了..当然只有一个人就不用跑了 看起来会T得很惨..但dinic在单位网络里是O(m*n^0.5)的... #include ...

随机推荐

  1. Week1 Team Homework #1: Study the projects done by previous student groups

      我们研究了学长的项目:百度3D地图API的调用.下面是我们对该项目的一些看法: 优点: 界面清晰 各类之间调用及其他关系容易理清. 缺点: 前段html代码过于冗杂,很多(div)块间的层次关系不 ...

  2. JSTL标签总结

    一.JSTL简介: 1.JSP标准标签库JSTL(JSP Standard Tag Library)是一个JSP标签集合,它封装了JSP应用的通用核心功能. 2.JSTL支持通用的.结构化的任务.比如 ...

  3. Ui设计哪里有好的素材

    刚看到花瓣网,的确不错,以后得多逛逛了.(不喷广告,只留作笔记)

  4. httpClient无证书访问

    1.当不需要使用任何证书访问https网页时,只需配置信任任何证书 HttpClient http = new HttpClient(); String url = "https://pay ...

  5. linux源码阅读笔记 asm函数

    在linux源码中经常遇到__asm__函数.它其实是函数asm的宏定义 #define __asm__ asm,asm函数让系统执行汇编语句. __asm__常常与__volatile__一起出现. ...

  6. 配置sql server2012属性 ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.zh-CHS/s10de_5techref/html/6df812ad-4d80-4503-8a23-47719ce85624.htm

    服务与服务器是两个不同的概念,服务器是提供服务的计算机,配置服务器主要是对内存.处理器.安全性等几个方面配置.由于SQL Server 2005服务器的设置参数比较多,这里选一些比较常用的介绍. 配置 ...

  7. UVA 10246 Asterix and Obelix

    题意:每个城市举办庆祝有一定的花费,A在路径上会选择庆祝花费最大的城市 让你求,A回家所花的路费和庆祝费最少,也就是说并不是最短路径就是结果, 还有可能就是路费比最短路径的多,但是庆祝费就比它的少,总 ...

  8. hdu 4427 Math Magic DP

    思路: dp[i][j][k]表示满足前i个数,和为j,lcm为k的数目. 设a为解的第i+1个数. 那么状态转移就为 dp[i+1][j+a][lcm(a,k)]+=dp[i][j][k]. 但是由 ...

  9. Struts2 本是非单例的,与Spring集成就默认为单例

    1.Struts2本身action类是多例,此设计的原因在于本身action担任了数据载体,如果做成单例,则会便多用户数据受到影响: 2.当Struts2 与 spring整合时,Struts2的Ac ...

  10. [转]Ubuntu 常用快捷键10个

    转自:http://www.linuxeden.com/html/news/20100613/103374.html 1.前一个后一个工作区的切换 如果你经常使用工作区,那你就可以用Ctrl + Al ...