44pts,arr_i 可以等于 2 的点全炸
查看原帖
44pts,arr_i 可以等于 2 的点全炸
507348
__vector__楼主2023/6/2 23:51


两个晚上了,会关注指出问题的。
提前 /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*/  
2023/6/2 23:51
加载中...