Codeforces Round #179 (Div. 2): D. Greg and Graph(Floyd)
阿新 • • 發佈:2018-11-23
題意:
給你n個點有向圖的鄰接矩陣,之後再給你n個數,它一定是1到n的全排列,對於第i個點,求出在刪掉這個點以及與這個點相鄰的所有邊之前,當前剩下所有點兩兩最短路之和,注意刪除操作是持久的,也就是最後整個圖一定為空
思路:
水題,倒過來按照刪點的順序floyd就行了
#include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<string> #include<math.h> #include<queue> #include<stack> #include<iostream> using namespace std; #define LL long long #define mod 1000000007 LL ans[505]; int a[505], flag[505], road[505][505]; int main(void) { int n, i, j, k, p; scanf("%d", &n); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) scanf("%d", &road[i][j]); } for(i=1;i<=n;i++) scanf("%d", &a[i]); for(p=n;p>=1;p--) { k = a[p]; flag[a[p]] = 1; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { road[i][j] = min(road[i][j], road[i][k]+road[k][j]); if(flag[i] && flag[j]) ans[p] += road[i][j]; } } } for(i=1;i<=n;i++) printf("%lld ", ans[i]); puts(""); return 0; }