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;
}