期望dp,求查错
查看原帖
期望dp,求查错
142110
yu__xuan楼主2020/5/6 19:24

n遍堆优化dijkstra,不知道为什么不开O2会TLE两个点。 然后我WA了,求查错。/kk

#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
#include<queue>
#define MAXN 2001
#define inf 2147483647

inline void read(int &T) {
	int x=0;bool f=0;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	T=f?-x:x;
}

typedef std::pair<int,int> pii;
std::priority_queue<pii,std::vector<pii>,std::greater<pii> >q;
int n,m,v,e,pthn,head[301],a[MAXN],b[MAXN],dis[301][301];
double ans=inf*114514.0,k[MAXN],dp[MAXN][MAXN][1];
bool vis[301];
struct Edge {
	int next,to,w;
}pth[90001<<1];

void add(int from,int to,int w) {
	pth[++pthn].to=to,pth[pthn].next=head[from];
	pth[pthn].w=w,head[from]=pthn;
}

double min(double a,double b) {
	return a<b?a:b;
}

void dij(int s) {
	memset(vis,0,sizeof vis);
	for(int i=0;i<=v;++i) dis[s][i]=inf;
	dis[s][s]=0;
	q.push(std::make_pair(dis[s][s],s));
	while(!q.empty()) {
		pii u=q.top();q.pop();
		if(vis[u.second]) continue;
		vis[u.second]=1;
		for(int i=head[u.second];i;i=pth[i].next) {
			int x=pth[i].to;
			if(!vis[x]&&dis[s][x]>u.first+pth[i].w) {
				dis[s][x]=dis[s][u.second]+pth[i].w;
				q.push(std::make_pair(dis[s][x],x));
			}
		}
	}
}

int main() {
	read(n),read(m),read(v),read(e);
	for(int i=1;i<=n;++i) read(a[i]);
	for(int i=1;i<=n;++i) read(b[i]);
	for(int i=1;i<=n;++i) scanf("%lf",&k[i]);
	for(int i=1,x,y,w;i<=e;++i) {
		read(x),read(y),read(w);
		add(x,y,w),add(y,x,w);
	}
	for(int i=1;i<=v;++i) dij(i);
	for(int i=1;i<=v;++i) dis[0][i]=dis[i][0]=0;
	for(int i=0;i<=n;++i) {
		for(int j=0;j<=m;++j) {
			dp[i][j][0]=dp[i][j][1]=inf*114514.0;
		}
	}
	dp[1][0][0]=dp[1][1][1]=0;
	for(int i=2;i<=n;++i) {
		dp[i][0][0]=dp[i-1][0][0]+dis[a[i-1]][a[i]];
		for(int j=1;j<=min(i,m);++j) {
			dp[i][j][0]=min(dp[i][j][0],min(dp[i-1][j][0]+dis[a[i-1]][a[i]],dp[i-1][j][1]+dis[b[i-1]][a[i]]*k[i-1]+dis[a[i-1]][a[i]]*(1-k[i-1])));
			dp[i][j][1]=min(dp[i][j][1],min(dp[i-1][j-1][0]+dis[a[i-1]][b[i]]*k[i]+dis[a[i-1]][a[i]]*(1-k[i]),dp[i-1][j-1][1]+dis[b[i-1]][b[i]]*k[i]*k[i-1]+dis[b[i-1]][a[i]]*(1-k[i])*k[i-1]+dis[a[i-1]][b[i]]*(1-k[i-1])*k[i]+dis[a[i-1]][a[i]]*(1-k[i-1])*(1-k[i])));
		}
	}
	for(int i=0;i<=m;++i) ans=min(ans,min(dp[n][i][0],dp[n][i][1]));
	printf("%.2lf\n",ans);
	return 0;
}
2020/5/6 19:24
加载中...