제출 #1334832

#제출 시각아이디문제언어결과실행 시간메모리
1334832paulxaxaCities (BOI16_cities)C++20
100 / 100
1211 ms39972 KiB
#include<bits/stdc++.h>

#define NMAX 200005
#define LOG 19
#define ll long long int
#define MOD 998244353
#define BASE 32
#define INF (ll)1e17

#define VMAX 30000
using namespace std;

ifstream fin("cod.in");
ofstream fout("cod.out");

int n,k,m;
int a[NMAX+1];


vector<pair<int,int>> adj[NMAX+1];

ll dist[1<<5][NMAX+1];

bool cmpHeap(pair<ll,int> a,pair<ll,int> b)
{
    return a.first > b.first;
}

void dijkstra(int mask)
{
    vector<pair<ll,int>> pq;
    for(int i=1;i<=n;i++)
    {
        if(dist[mask][i] < 1e17)
        {
            pq.push_back({dist[mask][i], i});
        }
    }
    make_heap(pq.begin(),pq.end(),cmpHeap);

    while(!pq.empty())
    {
        pop_heap(pq.begin(),pq.end(),cmpHeap);
        int x = pq.back().second;
        ll d = pq.back().first;
        pq.pop_back();

        if(dist[mask][x]==d)
        {
            for(auto [y,c] : adj[x])
            {
                if(dist[mask][y] > dist[mask][x] + c)
                {
                    dist[mask][y] = dist[mask][x] + c;
                    pq.push_back({dist[mask][y], y});
                    push_heap(pq.begin(),pq.end(),cmpHeap);
                }
            }
        }
    }

}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);

    cin >> n >> k >> m;
    for(int i=0;i<k;i++)
    {
        cin >> a[i];
    }
    for(int i=1;i<=m;i++)
    {
        int x,y,c;
        cin >> x >> y >> c;
        adj[x].push_back({y,c});
        adj[y].push_back({x,c});
    }
    for(int mask=1;mask<(1<<k);mask++)
    {
        for(int i=1;i<=n;i++)
        {
            dist[mask][i] = 1e17;
        }
    }
    for(int i=0;i<k;i++)
    {
        for(int j=1;j<=n;j++)
        {
            dist[1<<i][j] = j==a[i] ? 0 : 1e17;
        }
        dijkstra(1<<i);
    }

    for(int mask=1;mask < (1<<k);mask++)
    {
        if(__builtin_popcount(mask) == 1)continue;
        vector<int> b;
        for(int j=0;j<k;j++)
        {
            if(mask & (1<<j))
            {

            }
        }
        for(int j=0;j<k;j++)
        {
            if(mask & (1<<j))
            {
                for(int i=1;i<=n;i++)
                {
                    dist[mask][i] = min(dist[mask][i], dist[mask^(1<<j)][i] + dist[1<<j][i]);
                }
            }
        }
        dijkstra(mask);
    }

    ll mn = 1e17;
    for(int i=1;i<=n;i++)
    {
        mn = min(mn,dist[(1<<k)-1][i]);
    }
    cout << mn << "\n";
}
#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...