Cod sursa(job #2572916)

Utilizator spartanul300Vasile Andrei spartanul300 Data 5 martie 2020 14:54:24
Problema Ubuntzei Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");

priority_queue < pair <int,int> , vector < pair <int,int > > , greater <pair <int,int > > > q;
int n,dist[2010][2010];
vector <pair <int,int > > v[2010];

void Dijkstra(int start_nod)
{
    for(int i=1;i<=n;i++)dist[start_nod][i]=INT_MAX/2;
    dist[start_nod][start_nod]=0;
    q.push({0,start_nod});

    while(!q.empty())
    {
        int nod=q.top().second;
        if(dist[start_nod][nod]<q.top().first){q.pop();continue;}
        else q.pop();

        for(int i=0;i<v[nod].size();i++)
        {
            int vecin=v[nod][i].first;
            int dist_intre=v[nod][i].second;
            if(dist[start_nod][vecin]>dist[start_nod][nod]+dist_intre)
            {
                dist[start_nod][vecin]=dist[start_nod][nod]+dist_intre;
                q.push({dist[start_nod][vecin],vecin});
            }
        }
    }
}

int m,k,i,x,y,j,inter,cost,dp[2][262144][18],vecin[101][101],p[2010];
int main()
{
    f>>n>>m;
    f>>k;
    for(i=1;i<=k;i++)f>>p[i];
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>cost;
        v[x].push_back({y,cost});
        v[y].push_back({x,cost});
    }

    p[0]=1;
    k++;p[k]=n;
    for(i=0;i<=k;i++)
    {
        Dijkstra(p[i]);
    }

    for(i=0;i<=k;i++)
    for(j=0;j<=k;j++)
        vecin[i][j]=dist[p[i]][p[j]];

    k++;
    for(i=1;i<(1<<k);i++)
        for(j=0;j<k;j++)
            dp[0][i][j]=INT_MAX/2;

    dp[0][(1<<0)][0]=0;
    for(i=1;i<(1<<k);i++)
    {
        for(j=0;j<k;j++)
        {
            if((i&(1<<j)))
            {
                for(inter=0;inter<k;inter++)
                {
                    if(vecin[inter][j]!=INT_MAX/2 && (i&(1<<inter)))
                        dp[0][i][j]=min(dp[0][i][j],dp[0][i^(1<<j)][inter]+vecin[inter][j]);
                }
            }
        }
    }


    g<<dp[0][(1<<k)-1][k-1];
    return 0;
}