码迷,mamicode.com
首页 > 其他好文 > 详细

295B - Greg and Graph (floyd逆序处理)

时间:2018-11-10 15:57:22      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:题意   name   using   const   style   amp   arp   sha   +=   

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

分析:首先想到的是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逆序处理)

标签:题意   name   using   const   style   amp   arp   sha   +=   

原文地址:https://www.cnblogs.com/carcar/p/9939576.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!