AtCoderD - Shortest Path Queries 2 dp

Posted karshey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoderD - Shortest Path Queries 2 dp相关的知识,希望对你有一定的参考价值。

D
参考

数据范围n最大400可以想到n3的复杂度。
f(s,t,k)可以分为不经过k点和经过k点。不经过就是f(s,t,k-1),经过就相当于:s—>k—>t;即f(s,t,k)=f(s,k,k-1)+f(k,t,k-1);
由于是问最短,我们可以选择是否经过(如果有得选)。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
#define pb push_back
#define fi first
#define se second
#define mem(a,x) memset(a,x,sizeof(a));
#define db double 
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define debug(x) cout<<#x<<" "<<x<<endl;
const int inf=0x3f3f3f3f;
const int MOD=1e9+7;
//单向图======================
const int N=450;
int n,m;
int dp[N][N][N];//看到数据小于500 猜到o(n3) 
int main()
{
	cin>>n>>m;
	mem(dp,0x3f3f3f3f);
	fir(i,1,m)
	{
		int a,b,c;scanf("%d%d%d",&a,&b,&c);
		dp[a][b][0]=c;
	}
	fir(i,1,n)
	{
		dp[i][i][0]=0;
	}
	ll ans=0;
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
			{
				dp[i][j][k]=min(dp[i][j][k-1],dp[i][k][k-1]+dp[k][j][k-1]);
			//	ans+=dp[i][j][k];
			//	cout<<i<<" "<<j<<" "<<k<<" "<<dp[i][j][k]<<endl;
			}
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
			{
				if(dp[i][j][k]==0x3f3f3f3f) dp[i][j][k]=0;
				ans+=dp[i][j][k];
			}
	cout<<ans;
	return 0; 
}

以上是关于AtCoderD - Shortest Path Queries 2 dp的主要内容,如果未能解决你的问题,请参考以下文章

AOJ GRL_1_B: Shortest Path - Single Source Shortest Path (Negative Edges) (Bellman-Frod算法求负圈和

6-17 Shortest Path [4] (25分)

6-16 Shortest Path [3] (25分)

LeetCode 1091. Shortest Path in Binary Matrix

[LintCode] 611. Knight Shortest Path

codeforces- Shortest path of the king