Cod sursa(job #2122124)

Utilizator liviu2000Dragomirescu Liviu liviu2000 Data 4 februarie 2018 17:44:38
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <bits/stdc++.h>
#define NMAX 2001
#define KMAX 16
using namespace std ;

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

vector<pair<int,int> > graf[NMAX] ;
int t[KMAX] , d[NMAX] , dist[KMAX][NMAX] , dp[1<<KMAX][KMAX] ;
bool ubun[KMAX] ;
int n , m , k ;

class compar
{
public:
    bool operator () ( const int &x , const int &y )
    {
        return d[x] > d[y] ;
    }
};
void citire()
{
    int i , x , y , c ;
    fin >> n >> m ;
    fin >> k ;
    for ( i = 0 ; i < k ; i++ )
    {
        fin >> t[i] ;
        ubun[t[i]] = true ;
    }
    for ( i = 1 ; i <= m ; i++ )
    {
        fin >> x >> y >> c ;
        graf[x].push_back(make_pair(y,c)) ;
        graf[y].push_back(make_pair(x,c)) ;
    }
}

void dijkstra(int nod,int idx)
{
    int i ;
    priority_queue<int,vector<int> ,compar> pq ;
    pq.push(nod) ;
    memset(d,0x3f3f3f3f,4*n+4) ;
    d[nod] = 0 ;
    dist[idx][nod] = 0 ;
    while (!pq.empty())
    {
        nod = pq.top() ;
        pq.pop() ;
        for ( i = 0 ; i < graf[nod].size() ; i++ )
        {
            if ( d[graf[nod][i].first] > d[nod] + graf[nod][i].second )
            {
                dist[idx][graf[nod][i].first] = d[nod] + graf[nod][i].second ;
                d[graf[nod][i].first] = d[nod] + graf[nod][i].second ;
                pq.push(graf[nod][i].first) ;
            }
        }
    }
}

void dinamic()
{
    int i , j , idx ;
    for ( i = 1 ; i < (1<<k) ; i++ )
        for ( j = 0 ; j < k ; j++ )
            dp[i][j] = 0x3f3f3f3f ;
    for ( i = 0 ; i < k ; i++ )
        dp[1<<i][t[i]] = d[t[i]] ;
    for ( i = 1 ; i < (1<<k) ; i++ )
    {
        for ( j = 0 ; j < k ; j++ )
        {
            if ( (i&(1<<j)) != 0 )
            {
                for ( idx = 0 ; idx < k ; idx++ )
                {
                    if ( (i&(1<<idx)) == 0 )
                    {
                        dp[i|(1<<idx)][idx] = min(dp[i|(1<<idx)][idx],dp[i][j]+dist[j][t[idx]]) ;
                    }
                }
            }
        }
    }
}

int main()
{
    int i , j , sol ;
    citire() ;
    dijkstra(1,k) ;
    if ( k == 0 )
    {
        fout << d[n] ;
        return 0 ;
    }
    for ( i = 0 ; i < k ; i++ )
        dijkstra(t[i],i) ;
    dijkstra(1,k) ;
    dinamic() ;
    sol = 0x3f3f3f3f ;
    for ( i = 0 ; i < k ; i++ )
    {
        sol = min(sol,dp[(1<<k)-1][i]+dist[i][n]) ;
    }
    fout << sol ;
}