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

版权声明:本文为博主原创文章,你们可以随便转载 https://blog.csdn.net/Jaihk662/article/details/84142643

题意:

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

猜你喜欢

转载自blog.csdn.net/Jaihk662/article/details/84142643
今日推荐