Cod sursa(job #2560724)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 28 februarie 2020 11:08:46
Problema Ubuntzei Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <bits/stdc++.h>
#define Dim 2020
#define Lim (1<<16)+10
#define oo 1e9+1
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int N,M,K,a,b,c,dp[Lim][Dim],ans=-1,Poz[Dim],ras;
bool Frd[Dim],viz[Lim][Dim];

struct edge
{
    int ver,pay;
};

vector < edge > V[Dim];

struct coada
{
    int mlt,vrt;
};

void Bell()
{
   queue < coada > qu;
   viz[0][1]=1;
   qu.push({0,1});
   dp[0][1]=0;

   while(!qu.empty())
   {
       int nod=qu.front().vrt;
       int multime=qu.front().mlt;

       viz[multime][nod]=0;
       qu.pop();

       if( dp[multime][nod] > dp[ras][N] ) continue;

       for(unsigned int i=0;i<V[nod].size();i++)
       {
           int vecin = V[nod][i].ver;
           int cost = V[nod][i].pay;

           if( dp[multime][nod] + cost < dp[multime][vecin] )
           {
               dp[multime][vecin]=dp[multime][nod] + cost;
               if( !viz[multime][vecin] )
               {
                   viz[multime][vecin]=1;
                   qu.push({multime,vecin});
               }
           }

           if( Frd[vecin] && ( multime & ( 1 << Poz[vecin] ) ) == 0 )
           {
               if( dp[multime][nod] + cost < dp[( multime ^ ( 1 << Poz[vecin] ) ) ][vecin] )
               {
                   dp[( multime ^ ( 1 << Poz[vecin] ) )][vecin]=dp[multime][nod] + cost;
                   if( !viz[( multime ^ ( 1 << Poz[vecin] ) )][vecin] )
                   {
                       viz[( multime ^ ( 1 << Poz[vecin] ) )][vecin]=1;
                       qu.push({( multime ^ ( 1 << Poz[vecin] ) ),vecin});
                   }
               }
           }


       }

   }
}

int main()
{
    f>>N>>M>>K;
    for(int i=1;i<=K;i++)
    {
        f>>a;
        Frd[a]=1;
        Poz[a]=i;
    }
    for(int i=1;i<=M;i++)
    {
        f>>a>>b>>c;
        V[a].push_back({b,c});
        V[b].push_back({a,c});
    }

    for(int i=0;i<(1<<(K+1));i++)
    for(int j=1;j<=N;j++) dp[i][j]=oo;

    for(int i=1;i<=K;i++) ras=ras^(1<<i);

    Bell();

    g<<dp[ras][N];


    return 0;
}