jzoj P2433 【普及_模拟】最短路上的统计

206 篇文章 0 订阅
16 篇文章 0 订阅

题目大意:
一个无向图上,有N个点,M条边,每条边表示a,b之间有一条边,没有自环,所有边的权值均为1。有p个询问,对于一个点(a,b),求所有a与b之间所有最短路上的点的总个数。

n<=100,p<=5000

题解:
floyd+枚举:
1.首先二话不说floyd求出任意2点之间的最短路。
2.枚举N个点,以第i个点为断点,判断i连接a,b两点组成的最短路是否与已求的的a,b之间的最短路相同花费,相同就给答案累加1。
时间复杂度:O(N^3)

var
     f:array [0..101,0..101] of longint;
     x,y,i,j,k,n,m,p,ans:longint;
begin
     readln(n,m);
     for i:=1 to n do
         begin
               for j:=1 to n do f[i,j]:=maxlongint div 2;
               f[i,i]:=0;
         end;
     for i:=1 to m do
         begin
              readln(x,y);
              f[x,y]:=1;
              f[y,x]:=1;
         end;
     for k:=1 to n do
         for i:=1 to n do
             for j:=1 to n do
                 if (i<>j) and (i<>k) and (k<>j) then
                    if f[i,j]>f[i,k]+f[k,j] then f[i,j]:=f[i,k]+f[k,j];
     readln(p);
     for i:=1 to p do
         begin
              readln(x,y);
              ans:=0;
              for j:=1 to n do
                  if f[x,j]+f[j,y]=f[x,y] then inc(ans);
              writeln(ans);
         end;
end.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值