首先观察到 \(n \leq 300\) 加上全源“最短路”便可以自然而然的想到 floyd
。
注意到 floyd
算法的可行性只依赖统计的东西具有优先级。
这里我们定义优先级为最短路最短且价值和最高。也就是在最短路相同的情况下比较价值和。
然后跑一遍 floyd
板子即可,复杂度 \(O(n^3)\)。
#include<bits/stdc++.h>
#define int long long
#define inf 1e18
using namespace std;
const int maxn =301;
pair<int,int> dp[maxn][maxn];
int a[maxn];
int n;
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
char c;
cin>>c;
dp[i][j]=make_pair(c=='Y'?1:inf,c=='Y'?a[i]+a[j]:0);
if(i==j) dp[i][j]=make_pair(0,a[i]);
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j&&i!=k&&j!=k)
{
pair<int,int> New=make_pair(dp[i][k].first+dp[k][j].first,dp[i][k].second+dp[k][j].second-a[k]);
if(New.first<dp[i][j].first||(New.first==dp[i][j].first&&New.second>dp[i][j].second))
dp[i][j]=New;
}
int t;
cin>>t;
while(t--)
{
int u,v;
cin>>u>>v;
if(dp[u][v].first!=inf) cout<<dp[u][v].first<<' '<<dp[u][v].second<<'\n';
else cout<<"Impossible\n";
}
}
标签:int,题解,second,maxn,abc286e,pair,New,dp
From: https://www.cnblogs.com/chifan-duck/p/17064080.html