80pts求条
查看原帖
80pts求条
572587
cmrhhh楼主2024/12/28 16:02

遇到的问题:

  1. 惊奇发现floyd不会写了,于是复制5遍水一下
  2. 就是不知道的错了,求条QWQ
#include<bits/stdc++.h>
using namespace std;
#define db double
const int maxn=2e3+10;
int n,m,v,e,c[maxn+10],w[maxn+10][maxn+10],d[maxn+10];
db k[maxn+10],f[maxn+10][maxn+10][2]/*f[i][j][0/1]在i阶段已经用了j次,且此次换不换*/;
int main(){
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n>>m>>v>>e;
	for(int i=1;i<=n;++i)cin>>c[i];
	for(int i=1;i<=n;++i)cin>>d[i];
	for(int i=1;i<=n;++i)cin>>k[i];
	memset(w,0x3f,sizeof w);
	for(int i=1;i<=n;++i)w[i][i]=0;
	for(int i=1,a,b,W;i<=e;++i){
		cin>>a>>b>>W;
		w[a][b]=w[b][a]=min(W,w[a][b]);
	}
	for(int x=1;x<=v;++x){
		for(int y=1;y<=v;++y){
			for(int o=1;o<=v;++o){
				if(w[x][o]+w[o][y]<w[x][y])w[x][y]=w[x][o]+w[o][y];
			}
		}
	}
	for(int x=1;x<=v;++x){
		for(int y=1;y<=v;++y){
			for(int o=1;o<=v;++o){
				if(w[x][o]+w[o][y]<w[x][y])w[x][y]=w[x][o]+w[o][y];
			}
		}
	}
	for(int x=1;x<=v;++x){
		for(int y=1;y<=v;++y){
			for(int o=1;o<=v;++o){
				if(w[x][o]+w[o][y]<w[x][y])w[x][y]=w[x][o]+w[o][y];
			}
		}
	}
	for(int x=1;x<=v;++x){
		for(int y=1;y<=v;++y){
			for(int o=1;o<=v;++o){
				if(w[x][o]+w[o][y]<w[x][y])w[x][y]=w[x][o]+w[o][y];
			}
		}
	}
	for(int x=1;x<=v;++x){
		for(int y=1;y<=v;++y){
			for(int o=1;o<=v;++o){
				if(w[x][o]+w[o][y]<w[x][y])w[x][y]=w[x][o]+w[o][y];
			}
		}
	}
	for (int i = 1; i <= n; i++)
	    for (int j = 0; j <= min(m,i); j++) f[i][j][0] = f[i][j][1] = 1e9;
  	f[1][0][0] = f[1][1][1] = 0;
	for(int i=2;i<=n;++i){
		for(int j=0;j<=min(m,i);++j){
			f[i][j][0]=min(f[i-1][j][1]+(db)w[d[i-1]][c[i]]*k[i-1]+(db)w[c[i-1]][c[i]]*(1-k[i-1]),
						   f[i-1][j][0]+(db)w[c[i-1]][c[i]]);
			if(j)f[i][j][1]=min(f[i-1][j-1][0]+(db)w[c[i-1]][d[i]]*k[i]+(db)w[c[i-1]][c[i]]*(1-k[i]),
								f[i-1][j-1][1]+(db)w[c[i-1]][d[i]]*(1-k[i-1])*k[i]+
											   (db)w[c[i-1]][c[i]]*(1-k[i-1])*(1-k[i])+
											   (db)w[d[i-1]][d[i]]*k[i-1]*k[i]+
											   (db)w[d[i-1]][c[i]]*k[i-1]*(1-k[i]));
		}
	}
	db ans=(db)INT_MAX;
	for(int i=0;i<=m;++i)ans=min({ans,f[n][i][0],f[n][i][1]});
	cout << fixed << setprecision(2) << ans;
	return 0;
}
2024/12/28 16:02
加载中...