Problem B Codeforces 295B 最短路(floyd)

Description

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.

Sample Input

Input

101

Output

0 

Input

20 54 01 2

Output

9 0 

Input

40 3 1 16 0 400 12 4 0 11 1 1 04 1 2 3

Output

17 23 404 0 
 1 #include <cstdio>
 2 #include <cstring>
 3 #define maxn 510
 4 typedef long long LL;
 5 LL d[maxn][maxn];//存放最短距离
 6 int seq[maxn];//删除的顺序
 7 LL ans[maxn];//答案
 8
 9 inline LL min(LL a,LL b){
10     return a < b ? a : b;
11 }
12
13 void update(int s,int n){//floyd求最短距离
14     for(int i = 1;i <= n;i++)
15         for(int j = 1;j <= n;j++)
16             d[i][j] = min(d[i][s] + d[s][j],d[i][j]);
17 }
18
19 LL query(int s,int n){//反过来做。这样就相当于每次添加一个点到图中,然后询问当前图的所有点间最短距离之和。
20     LL sum = 0;
21     for(int i = n,u = seq[i];i >= s;u = seq[--i])//傻傻看不懂
22         for(int j = n,v = seq[j];j >= s;v = seq[--j])
23             sum += d[u][v];
24     return sum;
25 }
26
27 int main()
28 {
29     int n;
30     while(scanf("%d",&n) != EOF){
31         for(int i = 1;i <= n;i++)
32             for(int j = 1;j <= n;j++)
33                 scanf("%I64d",&d[i][j]);
34         for(int i = 1;i <= n;i++)
35             scanf("%d",&seq[i]);
36         for(int i = n;i >= 1;i--){
37             update(seq[i],n);
38             ans[i] = query(i,n);
39         }
40         for(int i = 1;i <= n;i++)
41             printf("%I64d ",ans[i]);
42         printf("\n");
43     }
44     return 0;
45 }

Problem B Codeforces 295B 最短路(floyd)

时间: 2024-10-18 18:15:33

Problem B Codeforces 295B 最短路(floyd)的相关文章

codeforces 295B B. Greg and Graph(floyd+dp)

题目链接: codeforces 295B 题目大意: 给出n个点的完全有权有向图,每次删去一个点,求每次操作前整张图各个点的最短路之和. 题目分析: 首先删边对于我们来说是不好做的,所以我们想到了通过加点的方式逆向地做,那么加点怎么做呢? 其实就是一个我们很熟悉的算法:floyd,因为我们通常用的都是它的简化版本,所以可能很多人并不理解它的确切的思想. 在介绍这道题的具体解法之前,我先解释一下floyd,可能之后的问题就迎刃而解了. 首先floyd其实是动态规划,没有省略时的状态是这样定义的.

UVa10048_Audiophobia(最短路/floyd)(小白书图论专题)

解题报告 题意: 求所有路中最大分贝最小的路. 思路: 类似floyd算法的思想,u->v可以有另外一点k,通过u->k->v来走,拿u->k和k->v的最大值和u->v比较,存下最小的值. #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #define inf 0x3f3f3f3f using namespace std;

SDUT 2930-人活着系列之开会(最短路Floyd)

人活着系列之开会 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 人活着如果是为了事业,从打工的到老板的,个个都在拼搏,奋斗了多年终于有了非凡成就,有了一笔丰富的钱财.反过来说,人若赚取了全世界又有什么益处呢?生不带来,死了你还能带去吗?金钱能买保险,但不能买生命,金钱能买药品,但不能买健康,人生在世,还是虚空呀! 在苍茫的大海上,有很多的小岛,每个人都在自己的小岛上.又到了开会的时候了,鹏哥通过飞信告知了每个人,然后大家就开

【bzoj2324】[ZJOI2011]营救皮卡丘 最短路-Floyd+有上下界费用流

原文地址:http://www.cnblogs.com/GXZlegend/p/6832504.html 题目描述 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队一共有N个据点,据点之间存在M条双向道路.据点分别从1到N标号.小智一行K人从真新镇出发,营救被困在N号据点的皮卡丘.为了方便起见,我们将真新镇视为0号据点,一开始K个人都在0号点. 由于火箭队的重重布防,要想摧毁K号据点,必须

POJ训练计划2253_Frogger(最短路/floyd)

解题报告 题意: 求0到1所有路中最大值最小的那个数. 思路: floyd. #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #define inf 0x3f3f3f3f using namespace std; int n,m,q; double mmap[210][210]; struct node { double x,y; } p[210]; doub

UVa10099_The Tourist Guide(最短路/floyd)(小白书图论专题)

解题报告 题意: 有一个旅游团现在去出游玩,现在有n个城市,m条路.由于每一条路上面规定了最多能够通过的人数,现在想问这个旅游团人数已知的情况下最少需要运送几趟 思路: 求出发点到终点所有路当中最小值最大的那一条路. 求发可能有多种,最短路的松弛方式改掉是一种,最小生成树的解法也是一种(ps,prime和dijs就是这样子类似的) #include <iostream> #include <cstdio> #include <cstring> #include <

Problem E CodeForces 237C

Description You've decided to carry out a survey in the theory of prime numbers. Let us remind you that a prime number is a positive integer that has exactly two distinct positive integer divisors. Consider positive integers a, a + 1, ..., b (a ≤ b).

CodeForces 295B

/*从要删除最后一个到第一个进行松弛操作, 因为如果从第一个到最后一个进行松弛操作,弟24行有可能不会更新,若要更新,就需要再一次对d[N][N]初始化*/ 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 typedef long long ll; 5 #define N 505 6 //const int inf=1<<30; 7 ll d[N][N],dis[N]; 8 int d

Problem F CodeForces 16E

Description n fish, numbered from 1 to n, live in a lake. Every day right one pair of fish meet, and the probability of each other pair meeting is the same. If two fish with indexes i and j meet, the first will eat up the second with the probability