zoukankan      html  css  js  c++  java
  • 295B

    题意:给出任意两点之间的距离,然后逐个删除这些点和与点相连的边,问,在每次删除前的所有点对的最短距离之和

    分析:首先想到的是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;
    }
    

      

  • 相关阅读:
    CodeForces-1263D Secret Passwords 并查集 求连通分量
    Virtual Friends HDU
    AreYouBusy HDU
    Jack Straws POJ
    Divisibility by 25 CodeForces
    逃离迷宫 HDU
    Find a way HDU
    Stall Reservations POJ
    Three displays CodeForces
    Radar Installation POJ
  • 原文地址:https://www.cnblogs.com/carcar/p/9939576.html
Copyright © 2011-2022 走看看