2021.7.12提高B组模拟1T2 最短路径(DP)
Posted SSL_LKJ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021.7.12提高B组模拟1T2 最短路径(DP)相关的知识,希望对你有一定的参考价值。
最短路径
题目大意
求一个无向图的最短路,去和回时必须经过一个特殊点
输入样例
5 1 3
1 3
3 4
4 1
7 5
8 3
输出样例
18.18
解题思路
参考某题解可做
AC代码
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,b1,b2,x[1005],y[1005];
double f[1005][1005],ans[1005][1005];
double jl(int x,int y)//距离
{
return 1.0*sqrt(1.0*abs(x)*abs(x)+1.0*abs(y)*abs(y));
}
int main()
{
freopen("path.in","r",stdin);
freopen("path.out","w",stdout);
scanf("%d%d%d",&n,&b1,&b2);
b1++,b2++;//+1
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x[i],&y[i]);
for(int j=1;j<i;j++)
f[i][j]=f[j][i]=jl(x[i]-x[j],y[i]-y[j]);
f[i][i]=0;
}
for(int i=0;i<=n;i++)//初值
for(int j=0;j<=n;j++)
ans[i][j]=2147483647;
ans[1][1]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j&&i>1)continue;
int k=max(i,j)+1;
if(k>n)//dp
{
if(i<n)ans[n][n]=min(ans[n][n],ans[i][j]+f[i][n]);
if(j<n)ans[n][n]=min(ans[n][n],ans[i][j]+f[j][n]);
}
else
{
if(k!=b2)ans[k][j]=min(ans[k][j],ans[i][j]+f[i][k]);
if(k!=b1)ans[i][k]=min(ans[i][k],ans[i][j]+f[j][k]);
}
}
printf("%0.2f",ans[n][n]);
return 0;
}
谢谢
以上是关于2021.7.12提高B组模拟1T2 最短路径(DP)的主要内容,如果未能解决你的问题,请参考以下文章
2021.8.9提高B组模拟1T2 QYQ在艾泽拉斯(Tarjan强连通分量)(并查集)
2021.8.9提高B组模拟1T2 QYQ在艾泽拉斯(Tarjan强连通分量)(并查集)