hihoCoder Challenge 23, Prob. A

时间限制:5000ms

单点时限:1000ms

内存限制:256MB

描述

有一个$n$个点的无向正权图$G$,这个图是连通的,小Y知道这些点两两之间的最短路的长度。

小J想要构造一个新的无向正权图$G'$,使得新图中两两之间的最短路的长度与原图一样,并且边数最少。

输入

第一行一个整数$n$,表示点的个数。

接下来$n$行,每行$n$个整数。第$i$行第$j$个整数表示$i$点到$j$点的在$G$中的最短路长度,保证合法。

$1\le n \le 300$,保证图$G$中最短路长度不超过$10^9$。

输出

一个整数表示新图$G'$的最小的边数。

样例输入

4

0 1 3 6

1 0 2 5

3 2 0 3

6 5 3 0

样例输出

3


Solution

这道题现场卡住了.

首先由题目描述可知原图$G$是连通图.

设$G=G(V,E)$, 现在不知道边集$E$, 只知道最短路矩阵$D$.

先考虑一个简化问题:

对于某条给定的边$(u,v)$, 能否从最短路矩阵判断它是否必需 ("必需"即一定存在于原图中), 如果能, 如何判断?

能. 判断方法: 判断是否 $\exists x \in V \setminus$ ${u, v}$使得$D_{u,v}=D_{u,x}+D_{x,v}$.

证明:

$\forall (u,v) \in E$, 用$w(u,v)$表示边$(u,v)$的长度. 显然$w(u,v) \ge D_{u,v}$. 又依题意, $\forall (u,v), \ w(u,v)>0$.

$D_{u,v}=D_{u,x}+D_{x,v}$ $\Longrightarrow w(u,v) < D_{u,x}, \ w(u, v) < D_{x, v}$.

$\Longrightarrow u \to x, \ x \to v$ 的最短路都一定不包含边 $(u,v)$. (这好像很显然:))

这样就可以放心地将边$(u,v)$从图$G$中删除, 而最短路矩阵不变.

这样就可以得出一个迭代的算法. 而且可以推出:

对于给定的最短路矩阵$D$, 与之对应的边数最少的图是唯一的.

思维链条:

某条边$(u,v)$是否必需由最短路矩阵$D$唯一确定 $\to$ 删去非必需的边后最短路矩阵$D$不变 $\to$ 删掉的边是"独立"的, 互不影响.

删边的独立性直白地说即是:只有当图$G$中存在一条能替代$(u,v)$这条边的路径时才把$(u,v)$删除。

Implementation

#include <bits/stdc++.h>
using namespace std; const int N=305; int d[N][N]; int main(){
int n;
cin>>n;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
cin>>d[i][j]; int res=n*(n-1)/2; for(int i=0; i<n; i++)
for(int j=i+1; j<n; j++){
for(int k=0; k<n; k++){
if(k!=i && k!=j && d[i][j]==d[i][k]+d[k][j]){
--res;
break;
}
}
} cout<<res<<endl;
return 0;
}

hihoCoder #1379 Emulator的更多相关文章

  1. hihoCoder挑战赛23

    hihoCoder挑战赛23 A.Emulator 题意 给一张图,有\(N(N \le 300)\)个点, 给出任意两点之间的最短路. 求最多可以去掉多少条边,使得任意两点的最短路长度不变. 思路 ...

  2. Visual Studio Emulator for Android 初体验

    Visual Studio Emulator for Android已经推出一段时间了,但一直没有用过.前两天下载安装用了下,整体感觉比谷歌自带的模拟器强多了.Visual Studio Emulat ...

  3. hihocoder -1121-二分图的判定

    hihocoder -1121-二分图的判定 1121 : 二分图一•二分图判定 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我是小Hi和小Ho的小伙伴Net ...

  4. Hihocoder 太阁最新面经算法竞赛18

    Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...

  5. hihoCoder太阁最新面经算法竞赛15

    hihoCoder太阁最新面经算法竞赛15 Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制: ...

  6. 【hihoCoder 1454】【hiho挑战赛25】【坑】Rikka with Tree II

    http://hihocoder.com/problemset/problem/1454 调了好长时间,谜之WA... 等我以后学好dp再来看为什么吧,先弃坑(╯‵□′)╯︵┻━┻ #include& ...

  7. 【hihocoder#1413】Rikka with String 后缀自动机 + 差分

    搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...

  8. [Android] Visual Studio Emulator For Android 相关

    1.修改设备名 C:\Users\[用户名]\AppData\Local\Microsoft\VisualStudioEmulator\Android\Containers\Local\Devices ...

  9. 【hihoCoder】1148:2月29日

    问题:http://hihocoder.com/problemset/problem/1148 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 思路: 1. 将问题转换成求两个日 ...

随机推荐

  1. ASP.NET MVC 多语言实现技巧 最简、最易维护和最快速开发

    说说传统做法的缺点 1.做过多语言的都知道这玩意儿太花时间 2.多语言架构一般使用资源文件.XML或者存储数据库来实现.这样就在一定程序上降低了性能 3.页面的可读性变差,需要和资源文件进行来回切换 ...

  2. 多线程处理中Future的妙用

    java 中Future是一个未来对象,里面保存这线程处理结果,它像一个提货凭证,拿着它你可以随时去提取结果.在两种情况下,离开Future几乎很难办.一种情况是拆分订单,比如你的应用收到一个批量订单 ...

  3. 用程序集编写clr表值函数:把正则表达式引入数据库中

    正则表达式非常好,但在数据库中就是没有,但可以通过程序集方式扩展 先编写一个dll,标量函数很好写,表值函数麻烦一点 下面是C#代码 using System; using System.Data; ...

  4. python环境搭建-在Windows上安装python3.5.2

    在Windows上安装Python3.5.2 首先,根据你的Windows版本(64位还是32位)从Python的官方网站下载Python 3.5.2对应的64位安装程序或32位安装程序(网速慢的同学 ...

  5. Mod4-PHP编码规范

    loading... 归纳总结了能找到的一些编码规范,形成自己所需要的编码规范. 参考网址:1.2 一.文件格式 缩进使用四个空格,不使用制表符.左花括号不另起一行. if (1 == $x) { $ ...

  6. import random 模块导入

    import random print(random.random()) #浮点数值 print(random.randint(1,2))#循环显示1,2 print(random.randrange ...

  7. Node.js项目目录介绍

    新建的项目结构应该是这样 bin:项目的启动文件,也可以放其他脚本. node_modules:用来存放项目的依赖库. public:用来存放静态文件(css,js,img). routes:路由控制 ...

  8. Oracle空串与null的处理

    来源于:http://blog.itpub.net/24870090/viewspace-1057853/ Oracle空串与null的处理[@more@] Oracle中的空字符串基本上是被当成空N ...

  9. Android NestedScrolling与分发机制 二

    上篇转载了 Android:30分钟弄明白Touch事件分发机制 这篇转载 Android中的dispatchTouchEvent().onInterceptTouchEvent()和onTouchE ...

  10. MySQL热备脚本

    MYSQL 备份方法:    热备:    http://blog.itpub.net/27099995/viewspace-1295099/    http://blog.csdn.net/dban ...