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 ...
随机推荐
- 使用了非标准扩展:“xxx”使用 SEH,并且“xxx”有析构函数
如果一个函数内使用了异常处理机制, VC 编译器在编译该函数时,它会给此函数插入一些“代码和信息”(代码指的是当该函数中出现异常时的回调函数,而信息主要是指与异常出现相关的一些必要的链表),因此每份函 ...
- semantic
cgfx 里会有这个 float4X4 View : View; :后面这个 view 是一种 叫做user defined semantic provide the correct data to ...
- function复习
#include <iostream> #include <functional> using namespace std; int fun(int a) { std::cou ...
- C++中的mutable关键字
mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词. 在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量,将永远 ...
- Open Phone, SMS, Email, Skype and Browser apps of Android in Unity3d
最近项目需要使用Android的一些基本功能,写插件各种悲剧,google了一下,如获至宝.Nice ! string url = String.Format("tel:{0}", ...
- Unity3D脚本中文系列教程(七)
http://dong2008hong.blog.163.com/blog/static/4696882720140311445677/?suggestedreading&wumii Unit ...
- c#中HttpWebRequest使用Proxy实现指定IP的域名请求
原文:http://www.cnblogs.com/greenerycn/archive/2010/04/11/httpwebreques_host_modify_By_set_proxy.html ...
- DataGridView之行的展开与收缩
很多数据都有父节点与子节点,我们希望单击父节点的时候可以展开父节点下的子节点数据. 比如一个医院科室表,有父科室与子科室,点击父科室后,在父科室下面可以展现该科室下的所有子科室. 我们来说一下在Dat ...
- 理解lua 语言中的点、冒号与self
转载自: http://blog.csdn.net/wangbin_jxust/article/details/12170233 lua编程中,经常遇到函数的定义和调用,有时候用点号调用,有时候用冒号 ...
- POJ 1270 Following Orders (拓扑排序,dfs枚举)
题意:每组数据给出两行,第一行给出变量,第二行给出约束关系,每个约束包含两个变量x,y,表示x<y. 要求:当x<y时,x排在y前面.让你输出所有满足该约束的有序集. 思路:用拓扑排 ...