AtCoderD - Shortest Path Queries 2 dp
Posted karshey
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoderD - Shortest Path Queries 2 dp相关的知识,希望对你有一定的参考价值。
数据范围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算法求负圈和
LeetCode 1091. Shortest Path in Binary Matrix