B. Greg and Graph

http://codeforces.com/contest/295/problem/B

floyd 算法的本质是动态规划 只有理解其中动态规划的原理 才能更好的运用

代码:

#include<iostream>

#include<cstdio>

#include<cstring>

#include<string>

#include<algorithm>



using namespace std;



const int N=505;

int a[N][N];

int b[N];

long long sum[N];



int main()

{

    //freopen("data.in","r",stdin);

	int n;

	while(cin>>n)

	{

		memset(sum,0,sizeof(sum));

		for(int i=1;i<=n;++i)

			for(int j=1;j<=n;++j)

			{

				cin>>a[i][j];

			}

		for(int i=1;i<=n;++i)

			cin>>b[i];

		for(int k=n;k>=1;--k)

		{

			for(int i=1;i<=n;++i)

				for(int j=1;j<=n;++j)

				{

					a[i][j]=min(a[i][j],a[i][b[k]]+a[b[k]][j]);

				}



			for(int i=k;i<=n;++i)

			for(int j=k;j<=n;++j)

			{

				sum[k]+=(a[b[i]][b[j]]);

			}





		}

		for(int i=1;i<=n;++i)

		cout<<sum[i]<<" ";

		cout<<endl;

	}

	return 0;

}

  

你可能感兴趣的:(Graph)