悬关!有人能告诉我我的DFS哪里有问题吗
查看原帖
悬关!有人能告诉我我的DFS哪里有问题吗
591458
qinziao楼主2024/8/15 19:07
#include<bits/stdc++.h>
using namespace std;
const int N=2005,E=180005,inf=87654321;
int n,m,v,e;
int w[350][350];
int a[N];
vector<int>ca,fca;
vector<double>lo;
void in(){
	scanf("%d%d%d%d",&n,&m,&v,&e);
	for(int i=1;i<=v;i++){
		for(int j=1;j<=v;j++){
			if(i==j) w[i][j]=0;
			else w[i][j]=inf;
		}
	}
	for(int i=1;i<=n;i++){
		int x;
		scanf("%d",&x);
		ca.push_back(x);
	}
	for(int i=1;i<=n;i++){
		int x;
		scanf("%d",&x);
		fca.push_back(x);
	}
	for(int i=1;i<=n;i++){
		double x;
		scanf("%lf",&x);
		lo.push_back(x);
	}
	for(int i=1;i<=e;i++){
		int x,y,ww;
		scanf("%d%d%d",&x,&y,&ww);
		w[x][y]=w[y][x]=ww;
	}
}
void floyed(){
	for(int k=1;k<=v;k++){
		for(int i=1;i<=v;i++){
			for(int j=1;j<=v;j++){
				if(w[i][j]>w[i][k]+w[k][j]){
					w[i][j]=w[i][k]+w[k][j];
				}
			}
		}
	}
}
double det(int x,int y,int z){
	return w[x][y]-w[z][y];
}
double ans=987654321.0;
void dfs(int i,int m,double xx){
//	printf("%d %d %.2lf\n",i,m,xx);
	if(m==0||i==n||xx<=0) {
		ans=min(ans,xx);
		return;	
	}
	
	double x=0.0;
	if(i==n-1){
		x=det(ca[i],ca[i-1],fca[i])*lo[i];
	}
	else if(i==0){
		x=det(ca[i],ca[i+1],fca[i])*lo[i];
	}
	else
		x=(det(ca[i],ca[i+1],fca[i])+det(ca[i],ca[i-1],fca[i]))*lo[i];
	if(x>=0&&xx>=x){
		int u=ca[i];
		ca[i]=fca[i];
		dfs(i+1,m-1,xx-x);
		ca[i]=u;
	}
	dfs(i+1,m,xx);
}
void solve(){
	floyed();
	double x=0.0;
	for(int i=1;i<n;i++){
		x+=w[ca[i-1]][ca[i]];
	}
	dfs(0,m,x);
	//坐标,申请次数,距离总和 
	printf("%.2f\n",ans);
}
int main(){
	in();
	solve();
	return 0;
}
2024/8/15 19:07
加载中...