博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 295 B. Greg and Graph
阅读量:5264 次
发布时间:2019-06-14

本文共 2870 字,大约阅读时间需要 9 分钟。

 

题意:

给定一个有边权的有向图。再给定一个1~n的排列。
按排列中的顺序依次删除点,问每次删除后,所有点对的最短路的和是多少。
 

删点看做倒序加点,然后模拟一遍Floyd

 

#include
#include
#include
#include
using namespace std;typedef long long LL;#define N 501int a[N];LL f[N][N];LL ans[N];bool use[N];template
void read(T &x){ x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }}int main(){ int n; read(n); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) read(f[i][j]); for(int i=1;i<=n;++i) read(a[i]); int k; for(int g=n;g;--g) { use[a[g]]=true; k=a[g]; for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) if(f[i][k]!=-1 && f[j][k]!=-1) f[i][j]=f[i][j]==-1 ? f[i][k]+f[k][j] : min(f[i][j],f[i][k]+f[k][j]); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) if(use[i] && use[j]) ans[g]+=f[i][j]; } for(int i=1;i<=n;++i) printf("%I64d ",ans[i]);}

 

B. Greg and Graph
time limit per test
3 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Greg has a weighed directed graph, consisting of n vertices. In this graph any pair of distinct vertices has an edge between them in both directions. Greg loves playing with the graph and now he has invented a new game:

  • The game consists of n steps.
  • On the i-th step Greg removes vertex number xi from the graph. As Greg removes a vertex, he also removes all the edges that go in and out of this vertex.
  • Before executing each step, Greg wants to know the sum of lengths of the shortest paths between all pairs of the remaining vertices. The shortest path can go through any remaining vertex. In other words, if we assume that d(i, v, u) is the shortest path between vertices v and u in the graph that formed before deleting vertex xi, then Greg wants to know the value of the following sum: .

Help Greg, print the value of the required sum before each step.

Input

The first line contains integer n (1 ≤ n ≤ 500) — the number of vertices in the graph.

Next n lines contain n integers each — the graph adjacency matrix: the j-th number in the i-th line aij (1 ≤ aij ≤ 105, aii = 0) represents the weight of the edge that goes from vertex i to vertex j.

The next line contains n distinct integers: x1, x2, ..., xn (1 ≤ xi ≤ n) — the vertices that Greg deletes.

Output

Print n integers — the i-th number equals the required sum before the i-th step.

Please, do not use the %lld specifier to read or write 64-bit integers in C++. It is preferred to use the cin, cout streams of the %I64dspecifier.

Examples
input
1 0 1
output
0
input
2 0 5 4 0 1 2
output
9 0
input
4 0 3 1 1 6 0 400 1 2 4 0 1 1 1 1 0 4 1 2 3
output
17 23 404 0

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/8423971.html

你可能感兴趣的文章
HDOJ 1754 I Hate It(线段树基本操作)
查看>>
latex tree
查看>>
安装NVIDIA驱动时禁用自带nouveau驱动
查看>>
HDU-1255 覆盖的面积 (扫描线)
查看>>
css3学习01
查看>>
【USACO】 奶牛会展
查看>>
ActiveMQ笔记之点对点队列(Point-to-Point)
查看>>
继承和多态
查看>>
Dijkstra+计算几何 POJ 2502 Subway
查看>>
修复IE不能执行JS的方法
查看>>
程序员究竟该如何提高效率zt
查看>>
希尔排序法(缩小增量法)
查看>>
PHP编程基础学习(一)——数据类型
查看>>
MongoDB-JAVA-Driver 3.2版本常用代码全整理(2) - 查询
查看>>
NPOI处理Word文本中上下角标
查看>>
Android笔记 Handler
查看>>
如何阅读大型前端开源项目的源码(转)
查看>>
java.util.Arrays类详解
查看>>
idea搭建tocmat
查看>>
NYOJ-626-intersection set(二分查找)
查看>>