295B - Greg and Graph (floyd逆序处理)
Posted carcar
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了295B - Greg and Graph (floyd逆序处理)相关的知识,希望对你有一定的参考价值。
题意:给出任意两点之间的距离,然后逐个删除这些点和与点相连的边,问,在每次删除前的所有点对的最短距离之和
分析:首先想到的是floyd,但是如果从前往后处理,复杂度是(500)^4,超时,我们从后往前处理,这样我们可以看作是添加点,而且这样的话每次只需要考虑添加点的缩进,所以复杂度是(500)^3,注意,我们每次添加一个点,就给他一个标记,代表这个点已经添加,然后算距离的时候,只有添加过的点才能加上距离
代码:
#include <bits/stdc++.h> using namespace std; #define ll long long const int maxn=500+10; ll ma[maxn][maxn],num[maxn],ans[maxn]; int n,vis[maxn]; int main() { ios::sync_with_stdio(false); cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>ma[i][j]; for(int i=1;i<=n;i++) cin>>num[i]; for(int i=n;i>=1;i--) { int v=num[i]; vis[v]=1; for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) ma[j][k]=min(ma[j][k],ma[j][v]+ma[v][k]); for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) if(vis[j]&&vis[k]&&j!=k)ans[i]+=ma[j][k]; } for(int i=1;i<=n;i++) cout<<ans[i]<<" "; cout<<endl; return 0; }
以上是关于295B - Greg and Graph (floyd逆序处理)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces 295A. Greg and Array