제출 #1228124

#제출 시각아이디문제언어결과실행 시간메모리
1228124DzadzoCyberland (APIO23_cyberland)C++20
97 / 100
1152 ms66212 KiB
#include <bits/stdc++.h>
#include "cyberland.h"
#define ll long long
#define pb push_back
#define S second
#define F first
#define pii pair<int,int>
#define vi vector<int>
#define vvi vector<vi>
#define vvvi vector<vvi>
#define vp vector<pii>
#define vvp vector<vp>
#define vb vector<bool>
#define vvb vector<vb>
#define INF 1000000000000000
#define MOD 1000000007
#define MAXN 200000
using namespace std;

// #pragma GCC optimize("O3,unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")


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) {
    vvp adj(n);
    for (int i=0;i<m;i++) {
        adj[x[i]].pb({y[i],c[i]});
        adj[y[i]].pb({x[i],c[i]});
    }


    vb visited(n);
    bool res=false;
    function<void(int)> dfs = [&](int v) {
        // cout<<v<<'\n';
        if (v==h) {
            res=true;
            return;
        }
        visited[v]=true;
        for (auto &[to,w]:adj[v]) {
            if (!visited[to]) {
                dfs(to);
            }
        }
    };
    dfs(0);
    if (!res)return -1;

    vector <vector <double>> dist(n, vector<double>(31, INF));
    dist[0][0]=0;

    priority_queue < pair < pair <double,int>,int>   ,  vector  < pair <pair <double,int>,int> >,greater< pair<pair <double,int>,int> >>  pq;


    pq.push({{dist[0][0],0},0});


    for (int i=1;i<n;i++)if (!arr[i] && visited[i]) {

        dist[i][0]=0;
        pq.push({{dist[i][0],0},i});
    }

    while (!pq.empty()) {
        int v=pq.top().S;
        int k=pq.top().F.S;
        int dis=pq.top().F.F;
        pq.pop();
        // if (dis != dist[v][k])continue;
        // cout<<v<<" "<<k<<" "<<dist[v][k]<<'\n';
        if (v==h)continue;
        for (auto &[to,w]:adj[v]) {
            if (dist[to][k] > dist[v][k] + w) {
                dist[to][k]=dist[v][k] + w;
                pq.push({{dist[to][k],k},to});
            }

            if (arr[to]==2 && k<30) {
                if (dist[to][k+1] > (dist[v][k] + w)/2) {
                    dist[to][k+1]=(dist[v][k] + w)/2;
                    pq.push({{dist[to][k+1],k+1},to});
                }
            }
        }
    }
    double ans=dist[h][0];
    // cout<<h<<'\n';
    for (int i=1;i<=min(K,30);i++)ans=min(ans,dist[h][i]);
    return ans;
}
// //
// int main() {
//     // int n,m,k,h;
//     // cin>>n>>m>>k>>h;
//     // vi arr;
//     // for (int i=0;i<n;i++) {
//     //     int x;
//     //     cin>>x;
//     //     arr.pb(x);
//     // }
//     // vi X,Y,C;
//     // for (int i=0;i<m;i++) {
//     //     int x,y,c;
//     //     cin>>x>>y>>c;
//     //     X.pb(x);
//     //     Y.pb(y);
//     //     C.pb(c);
//     // }
//     // cout<<solve(n,m,k,h,X,Y,C,arr);
//     cout<<solve(3, 2, 30, 2, {1, 2}, {2, 0}, {12, 4}, {1, 2, 1});
// }


/*

3 2 30
1
1 1 2
1 2 23211
0 1 9991
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...