NOIP2013最短路径延伸题目
查看原帖
NOIP2013最短路径延伸题目
677152
违规用户名^3Zj=Oha楼主2024/8/2 17:35

本题原型类似于NOIP2013最短路径,但需要额外输出路径,求如何输出路径

代码:

#include<bits/stdc++.h>
using namespace std;
double f[1005][1005],x[1005],y[1005],w[1005][1005];
int n,b1,b2,k,go[1005],back[1005];
stack<int> ans;
int main(){
	cin>>n>>b1>>b2;
	for(int i=1;i<=n;i++){
		cin>>x[i]>>y[i];
		for(int j=1;j<i;j++) w[i][j]=w[j][i]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
	} 
	for(int i=0;i<=n;i++){
		for(int j=0;j<=n;j++) f[i][j]=2147483647;
	}
	f[1][1]=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(i==j&&i>1) continue;
			k=max(i,j)+1;
			if(k>n){
				if(i==n){
					if(f[n][n]>f[i][j]+w[j][n]){
						f[n][n]=f[i][j]+w[j][n];
						go[n]=j;
					}	
				}
				if(j==n){
					if(f[n][n]>f[i][j]+w[i][n]){
						f[n][n]=f[i][j]+w[i][n];
						back[i]=n;
					}	
				}
			}
			else{
				if(k!=b2+1){
					if(f[k][j]>f[i][j]+w[i][k]){
						f[k][j]=f[i][j]+w[i][k];
						go[i]=k;
					}
				}
				if(k!=b1+1){
					if(f[i][k]>f[i][j]+w[j][k]){
						f[i][k]=f[i][j]+w[j][k];
						back[k]=j;
					}
				}
			}
		}
	}
	cout<<fixed<<setprecision(2)<<f[n][n]<<endl;
	int t=1;
	while(1){
		cout<<t-1<<" ";
		t=go[t];
		if(t==n) break;
	}
	t=n;
	while(t){
		cout<<t-1<<" ";
		t=back[t];
	}
	return 0;
}
2024/8/2 17:35
加载中...