两个晚上了,会关注指出问题的。
提前 /bx
#include "cyberland.h"
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int head[maxn*72*2];
struct EDGE
{
int to, nxt;
double val;
int tag;
} edge[maxn * 72 * 2];
int cnt;
void add(int u, int to, double val, int tag)
{
edge[++cnt].to = to;
edge[cnt].val = val;
edge[cnt].tag = tag;
edge[cnt].nxt = head[u];
head[u] = cnt;
}
double dis[maxn*72*2];
bool inq[maxn*72*2];
int cntt=0;
double solve(int N, int M, int K, int H, std::vector<int> x, std::vector<int> y, std::vector<int> c, std::vector<int> arr)
{
K=min(K,70);
auto id = [&](int x, int _)
{
return (_) * N + x;
};
for (int _ = 0; _ <= K; _++)
{
for (int i = 0; i < M; i++)
{
add(id(x[i], _), id(y[i], _), c[i], -1);
add(id(y[i], _), id(x[i], _), c[i], -1);
if(arr[y[i]]==2&&_!=K)
{
add(id(x[i],_),id(y[i],_+1),c[i],1);
}
if(arr[y[i]]==0)
{
add(id(x[i],_),id(y[i],_),c[i],0);
}
if(arr[x[i]]==2&&_!=K)
{
add(id(y[i],_),id(x[i],_+1),c[i],1);
}
if(arr[x[i]]==0)
{
add(id(y[i],_),id(x[i],_),c[i],0);
}
}
}
queue<int> q;
for (int i = 0; i <= N*31; i++)
dis[i] = 1e18;
q.push(0);
dis[0] = 0;
while (!q.empty())
{
int u = q.front();
q.pop();
inq[u] = 0;
if(u==H)continue;
// printf("u = %d.%d dis = %.5lf\n",u/N,u%N,dis[u]);
for (int i = head[u]; i; i = edge[i].nxt)
{
int to = edge[i].to;
if (edge[i].tag == -1)
{
if (dis[to] > dis[u] + edge[i].val)
{
dis[to] = dis[u] + edge[i].val;
if (!inq[to])
{
q.push(to);
inq[to] = 1;
}
}
}
else if (edge[i].tag == 1)
{
if (dis[to] > (dis[u]+edge[i].val) / 2.0)
{
dis[to] = (dis[u]+edge[i].val) / 2.0;
if (!inq[to])
{
inq[to] = 1;
q.push(to);
}
}
}
else if (edge[i].tag == 0)
{
if (dis[to] > 0)
{
// printf("to = %d\n",to);
dis[to] = 0;
if (!inq[to])
{
inq[to] = 1;
q.push(to);
}
}
}
// printf("dis[%d.%d] = %.5lf\n",to/N,to%N,dis[to]);
}
}
double res = 1e18;
for (int _ = 0; _ <= K; _++)
{
// printf("dis[%d] = %.10lf\n",id(H,_),dis[id(H,_)]);
res = min(res, dis[id(H, _)]);
}
if(res>1e15)res=-1;
// clean
cnt = 0;
for (int i = 0; i <= N*31; i++)
head[i] = dis[i] = inq[i] = 0;
return res;
}/*
#ifndef ONLINE_JUDGE
int main()
{
int N, M, K, H;
scanf("%d%d%d%d", &N, &M, &K, &H);
vector<int> arr(N), X(M), Y(M), C(M);
for (int i = 0; i < N; i++)
{
scanf("%d", &arr[i]);
}
for (int i = 0; i < M; i++)
{
scanf("%d", &X[i]);
scanf("%d", &Y[i]);
scanf("%d", &C[i]);
}
printf("%.10lf", solve(N, M, K, H, X, Y, C, arr));
return 0;
}
#endif*/