codevs2011最小距离之和 [2013年省队选拔赛辽宁]

题目网址:http://codevs.cn/problem/2011/

题目大意:有一个图,每次删一条边(可以重复删),求每次删边之后所有点对的最短距离之和。

  看了一眼题目,顿时发现了O(n^4)的暴力解法:每次删边之后跑一次Floyd,然后又看了一眼数据范围,发现n,m<=200……华丽丽的TLE……

  删边……好像不可做……但是如果是加边就好办了。看看能不能把删边转化成加边,于是……正解思路闪现了。

  其实这道题的思路就是把要删掉的边全部先删掉,跑一次Floyd,然后倒着加边,用加上的边更新最短路(设加上的边起点为x,终点为y,看i->x->y->j是否比直接i->j花费更小),就能在O(n^3)的时间内求出答案。

  代码:

var a:array[0..210,0..210]of longint;
  x,y,z,ans:array[0..210]of longint;
  n,m,i,j,k:longint;
  b:boolean;
begin
  read(n);
  for i:=1 to n do
    for j:=1 to n do
      read(a[i,j]);//读入图
  read(m);
  for i:=1 to m do begin
    read(x[i],y[i]); z[i]:=a[x[i],y[i]];
    a[x[i],y[i]]:=1<<29;//删边
  end;
  for k:=1 to n do
    for i:=1 to n do
      for j:=1 to n do
        if a[i,j]>a[i,k]+a[k,j] then a[i,j]:=a[i,k]+a[k,j];//跑Floyd
  for i:=m downto 1 do begin
    ans[i]:=0; b:=false;
    for j:=1 to n do begin
      for k:=1 to n do begin
        if a[j,k]>=1<<29 then begin
          ans[i]:=-1; b:=true; break;
        end;
        ans[i]:=ans[i]+a[j,k];
      end;
      if b then break;
    end;//算距离之和
    for j:=1 to n do
      for k:=1 to n do
        if a[j,k]>a[j,x[i]]+z[i]+a[y[i],k] then a[j,k]:=a[j,x[i]]+z[i]+a[y[i],k];//加边,更新答案
  end;
  for i:=1 to m do
    if ans[i]=-1 then writeln(‘INF‘)
    else writeln(ans[i]);//输出答案
end.

注:更新答案时不能用删掉的边直接覆盖掉原边,因为覆盖掉的花费可能更短。

时间: 2024-12-22 19:22:57

codevs2011最小距离之和 [2013年省队选拔赛辽宁]的相关文章

2534 渡河 2013年市队选拔赛广州

2534 渡河 2013年市队选拔赛广州 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有N个人需要渡河到对岸,但是只有一条小船,只能乘坐两人,请问怎么能够让他们以最少的时间渡河到对岸呢? 输入描述 Input Description 输入为两行,第一行为渡河的人数N (1<=N<=1000) 第二行为N个正整数,范围是 [1,100],代表他们划船到对岸需要多少分钟 输出描述 Output Description 输出只有

CSU-ACM2014年校队选拔赛指导赛解题报告

•Problem A  CSU 1065                               贪心 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 const int maxn = 1000010; 6 struct Node{ 7 int a,b; 8 bool operator < (const Node& rhs)

LNOI2013最小距离之和题解

http://codevs.cn/problem/2011/ 题目描述 Description DQ星球的世界末日就要到了,可是诺亚方舟还没有制造完成.为了制造诺亚方舟这个星球上的所有国家都站在统一战线.现在一共有n个国家,一个国家到另一个国家都有一条且仅有一条通信渠道,且这个渠道有一个距离,这样就形成了一个有向完全图. 世界末日的预兆已经来了,世界上很多东西都在遭到不明原因的破坏,包括这些通信渠道.现在为了联合制造出诺亚方舟,需要统计所有国家对(a到b和b到a是不同的)之间通信最短距离之和.即

BZOJ 3236 AHOI 2013 作业 莫队算法

题目大意:给出一些数,问在一个区间中不同的数值有多少种,和在一个区间中不同的数值有多少个. 思路:由于没有修改,所以就想到了莫队算法.然后我写了5K+的曼哈顿距离最小生成树,然后果断T了.(100s的时限啊,刷status都要刷疯了..,结果最后加了手写读入也没能A).后来果断放弃,写了分块版的莫队算法.84sAC...这题卡的..貌似莫队并不是正解. 其实用分块来写莫队就很简单了.只需要将所有询问的区间排序,左端点所在块作为第一键值,右端点作为第二季键值排序,之后就可以转移了.理论上来时还是曼

中山大学校队选拔赛第一章题4【简单数迷Simple Kakuro】-------2015年1月28日

一:题意描述 本题就是给定一个迷宫,其中第一行和第一列都给定了数值.现在我们的任务就是需要把剩余的空格用1-9的数字把它填满,并且每行每列数值之和需要和行列标定的值相等.问最后是否可行,如果有多种方案需要输出一种方案. 二 :题目分析 本题主要考查DFS当中剪枝技巧的利用以及DFS的方向规划问题. 首先我们可以根据题目已知信息得出行之和必须等于列之和.(第一次剪枝) 然后我们可以根据每一个数字不能在同一行或者同一列重复出现[设定标记]进行剪枝(第二次剪枝) 对于如果某一行(一列)数值还没有填满但

2298 石子合并 2008年省队选拔赛山东

题目描述 Description 在一个操场上摆放着一排N堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 试设计一个算法,计算出将N堆石子合并成一堆的最小得分. 输入描述 Input Description 第一行是一个数N. 以下N行每行一个数A,表示石子数目. 输出描述 Output Description 共一个数,即N堆石子合并成一堆的最小得分. 样例输入 Sample Input 4 1 1 1 1 样例输出 S

[codevs 2926] 黑白瓷砖(2002年安徽省队选拔赛)

描述 http://codevs.cn/problem/2926/ 题解: Polya定理的应用. 由于第一次做polya定理的题,故要写的详细些. 首先可以从题目中读到三个置换以及一个不动置换: 顺时针旋转120度. 顺时针旋转240度. 左右翻转180度. 旋转0度.(不动置换) 开始我本以为这样就算完成任务,就拿polya定理演算了一遍,结果发现n=2,n=3都不对.后来才明白现在的置换群中不满足封闭性.比如先顺时针旋转再左右翻转后的图形就不包含在内.所以还要增加两个斜向的翻转. 现在可以

中山大学校队选拔赛第一章题1【紧急逃离Emergent escape】----2015年1月26日

一: 题意描述 二:题目分析 本题的大致意思是讲:在给定的一个大圆上挖去很多圆(这些圆有的在大圆里面,有的在大圆外面,有的与圆相加),凡是被圆占据的部分则不能通行. 现在给定两个点,(lifeship和controlling room)如果两者能够到达的话表示能够Escape,否则就只有Die hard. 本题的主要考查图论知识和计算几何方面的知识.首先我们对于这个问题需要建模.我们首先可以把这个大圆看成单独的一个区域.现在的问题就是在整个大圆内找不到一条线可以让lifeship和control

中山大学校队选拔赛第二试题试题3【Compressed suffix array】-------2015年2月8日

一:题目大意 本题通过给定三个数组S0,P,S,其中S0是1到2n的一个排列,P具有2n个整数,且满足: 数组S是把数组S0中所有奇数元素全部删除并将所有偶数元素除以2并按照原来的相对顺序进行排列而得. 现在给定数组S和数组P,我们需要反求数组S0. 二:题目分析 我们通过对数组P的递推式分析可知:当数组S0的元素是偶数时,这个元素所对应的Pi的值一定等于i.当数组S0的元素为奇数时,我们可以知道对应的Pi一定不等于i.那么我们可以先对数组P扫一遍,把存在Pi=i的元素全部填好,然后再对数组P重