上学的道路 TYVJ1310

来源:互联网 发布:sqlserver 字符串函数 编辑:程序博客网 时间:2024/04/28 22:05

题目连接:http://new.tyvj.cn/Problem_Show.aspx?id=1310

主要是求2对点的最短路的公共部分最大是多少。

先瞎搞求出4个点的单源最短路。dij和spfa都可以。

然后对于任意两点i,j

如果d[x1,i]+d[y1,i]=d[x1,y1] 并且 d[x1,j]+d[y1,j]=d[x1,y1]  并且d[x2,i]+d[y2,i])=d[x2,y2]) 且 d[x2,j]+d[y2,j])=d[x2,y2] 

那么就可以判定I,J之间的在这两对点的最短路的公共部分,那么中间的那段部分就是公共长度了。


var  x,y,x1,y1,x2,y2,ans,aa,i,j,k,z,n,m,tot:longint;  v:array[-10..1600] of boolean;  q:array[-10..1500000] of longint;  d:array[-10..5,-10..1600] of longint;  next,a,c:array[-10..600005] of longint;  b:array[-10..1600] of longint;procedure spfa(k,o:longint);  var    i,h,t,x,y,z,p:longint;  begin    for i:=1 to n do  d[k,i]:=999999999;d[k,o]:=0;h:=1;t:=1;q[h]:=o;fillchar(v,sizeof(v),true);v[o]:=false;while h<=t do  begin    x:=q[h];p:=b[x];while p<>0 do  begin    y:=c[p];z:=a[p];if (d[k,x]+z)<d[k,y] then  begin    d[k,y]:=d[k,x]+z;if v[y] then  begin    v[y]:=false;t:=t+1;q[t]:=y;  end;  end;p:=next[p];  end;    h:=h+1;v[x]:=true;  end;  end;function check(k,y,z:longint):boolean;  begin    if ((d[1,k]+d[2,y]+z)=d[1,y1]) and ((d[3,k]+d[4,y]+z)=d[3,y2]) then exit(true);    if ((d[1,k]+d[2,y]+z)=d[1,y1]) and ((d[3,y]+d[4,k]+z)=d[3,y2]) then exit(true);    exit(false);  end;function try(k:longint):longint;  var    t,p,x,y,z:longint;  begin    t:=0;    v[k]:=false;    p:=b[k];y:=c[p];z:=a[p];while p<>0 do  begin    if v[y] then                  if check(k,y,z)  then    begin  x:=try(y)+z;  if x>ans then ans:=x;  if x>t then t:=x;end  else    if (d[1,k]+d[2,y]+z)=d[1,y1] then begin      x:=try(y);  if x>ans then ans:=x;end;    p:=next[p];y:=c[p];    z:=a[p];  end;v[k]:=true;        if t>0 then exit(t) else exit(0);  end;begin  read(n,m,x1,y1,x2,y2);  tot:=0;  for i:=1 to m do    begin  read(x,y,z);  tot:=tot+1;  next[tot]:=b[x];  b[x]:=tot;  a[tot]:=z;  c[tot]:=y;  tot:=tot+1;  next[tot]:=b[y];  b[y]:=tot;  a[tot]:=z;  c[tot]:=x;end;  spfa(1,x1);  spfa(2,y1);  spfa(3,x2);  spfa(4,y2);  fillchar(v,sizeof(v),true);  ans:=0;  for i:=1 to n do    for j:=1 to n do  if ((d[1,i]+d[2,i])=d[1,y1]) and ((d[1,j]+d[2,j])=d[1,y1]) then    if ((d[3,i]+d[4,i])=d[3,y2]) and ((d[3,j]+d[4,j])=d[3,y2]) then  begin        x:=abs(d[1,i]-d[1,j]);    if x>ans then ans:=x;  end;   writeln(ans);end.
Oct_gap 201说得对。。
我太垃圾了
这个题因为数组开小了弄了半天。
我太垃圾了