JZOJ 3808 【NOIP2014模拟8.25】道路值守

道路值守

Description

有一个有 N 个点,M条边的图,问对于该图内的每一对点对( x ,y)( x y),问 x ,y之间的所有的最短路径覆盖了多少条边。

Data Constraint

N <=500,任意两个点之间最多只有一条边连接。

Solution

先用 Floyd 最短路算法求出任意两点之间的最短距离。
(下面的 FX,Y 表示 X ,Y之间的最短距离, BX,Y 表示 X ,Y之间的连的边的长度)
然后枚举一个点 X ,再枚举Y, Z ,若FX,Y+ BY,Z = FX,Z 则说明 X Z之间的某条最短路径之中覆盖住了( Y ,Z)这一条边, SZ ++。( Si 表示以 i 结尾的上述的那种边的数量)
S数组处理好以后,再枚举 K1 , K2 ,若 FX,K1 + FK1,K2 = FX,K2 则说明 X K2的所有最短路径覆盖了 SK1 条边(易证), Ans(X,K2) += SK1 ,如此这般即可求出答案。

Code(Pacal)

var
    n,m,j,k,l,i,o,x,y,c,kk,ans:longint;
    be,ne,bh,bq:array[0..10000000] of longint;
    bz:array[0..1000] of boolean;
    dd,u,p,qy:qword;
    way:array[0..1000,0..5000] of qword;
    dy:array[0..270000,1..2] of qword;
    ok:array[0..250000] of qword;
    f,bc:array[0..500,0..500] of longint;
    dl,mi,sd:array[0..1000] of longint;
function min(a,b:longint):longint;
    begin
        if a<b then exit(a) else exit(b);
    end;
begin
    readln(n,m);
    for i:=1 to n do
    begin
        for l:=1 to n do f[i,l]:=maxlongint div 2;
        f[i,i]:=0;
    end;
    for i:=1 to n do
    begin
        for l:=1 to n do bc[i,l]:=maxlongint div 2+1;
        bc[i,i]:=0;
    end;
    for i:=1 to m do
    begin
        readln(x,y,c);
        inc(o); ne[o]:=be[x];
        be[x]:=o; bh[o]:=y; bq[o]:=c;
        inc(o); ne[o]:=be[y];
        be[y]:=o; bh[o]:=x; bq[o]:=c;
        f[x,y]:=min(f[x,y],c);  f[y,x]:=f[x,y];
        bc[x,y]:=c;  bc[y,x]:=c;
    end;
    for k:=1 to n do
    for i:=1 to n do
    for l:=1 to n do
    if f[i,k]+f[k,l]<f[i,l] then f[i,l]:=f[i,k]+f[k,l];
    for kk:=1 to n-1 do
    begin
        u:=1; p:=1;
        for i:=1 to n do sd[i]:=0;
        for k:=1 to n do
        for i:=1 to n do
        if i<>k then
        if f[kk,k]+bc[k,i]=f[kk,i] then inc(sd[i]);
        for i:=kk+1 to n do
        begin
            ans:=0;
            for l:=1 to n do
            if f[kk,l]+f[l,i]=f[kk,i] then ans:=ans+sd[l];
            write(ans,' ');
        end;
    end;
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值