换教室96pts#25最后一个点WA
查看原帖
换教室96pts#25最后一个点WA
300078
pengyule楼主2021/8/3 18:13

求助,谢谢

#include <bits/stdc++.h>
using namespace std;
const int N=2e3+5,VR=305;
int n,m,V,E;
int c[N],d[N],e[VR][VR];
double k[N],f[N][2][N];
int main(){freopen("P1850_25.in","r",stdin);
	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(e,0x3f,sizeof(e));
	for(int i=1;i<=n;i++)
		e[i][i]=0;
	for(int i=1,u,v,w;i<=E;i++){
		cin>>u>>v>>w;
		e[u][v]=e[v][u]=min(e[u][v],w);
	}
	for(int k=1;k<=V;k++)
		for(int i=1;i<=V;i++)
			for(int j=1;j<=V;j++)
				e[i][j]=min(e[i][j],e[i][k]+e[k][j]);
	/*for(int i=1;i<=n;i++,puts(""))
		for(int j=1;j<=n;j++)
			cout<<e[i][j]<<' ';*/
	for(int i=1;i<=n;i++)for(int j=0;j<=m;j++)f[i][0][j]=f[i][1][j]=1e9;
	f[1][0][0]=f[1][1][1]=0;
	for(int i=2;i<=n;i++){
		f[i][0][0]=f[i-1][0][0]+e[c[i-1]][c[i]];//printf("%f %f\n",f[i][0][0],f[i][1][0]);
		for(int j=1;j<=min(m,i);j++){
			f[i][0][j]=min(f[i-1][0][j]+e[c[i-1]][c[i]],f[i-1][1][j]+k[i-1]*e[d[i-1]][c[i]]+(1-k[i-1])*e[c[i-1]][c[i]]);//cout<<e[d[i-1]][c[i]] <<' ';
			if(j)f[i][1][j]=min(f[i-1][0][j-1]+k[i]*e[c[i-1]][d[i]]+(1-k[i])*e[c[i-1]][c[i]],f[i-1][1][j-1]+k[i-1]*k[i]*e[d[i-1]][d[i]]+(1-k[i-1])*k[i]*e[c[i-1]][d[i]]+k[i-1]*(1-k[i])*e[d[i-1]][c[i]]+(1-k[i-1])*(1-k[i])*e[c[i-1]][c[i]]);
			//printf("%f %f\n",f[i][0][j],f[i][1][j]);
		}
	}
	double ans=1e9;
	for(int i=0;i<=m;i++)
		ans=fmin(ans,min(f[n][0][i],f[n][1][i]));
	printf("%.2f",ans);
}
2021/8/3 18:13
加载中...