295B - Greg and Graph (floyd逆序處理)
阿新 • • 發佈:2018-11-10
name ios 一個點 需要 std pac 分析 num 超時
題意:給出任意兩點之間的距離,然後逐個刪除這些點和與點相連的邊,問,在每次刪除前的所有點對的最短距離之和
分析:首先想到的是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逆序處理)