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强连通分量)(并查集)

2021.7.12提高B组模拟1T1 好元素(hash)

求图的最短路径 c语言

2021.7.12提高B组模拟1T3 最长公共子串(记忆化搜索)

2021.7.12提高B组模拟1T4 Vani和Cl2捉迷藏(最大匹配)