1. 程式人生 > >Codeforces Round #179 (Div. 2): D. Greg and Graph(Floyd)

Codeforces Round #179 (Div. 2): D. Greg and Graph(Floyd)

 

題意:

給你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;
}