Cod sursa(job #2120579)

Utilizator liviu2000Dragomirescu Liviu liviu2000 Data 2 februarie 2018 17:38:53
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <bits/stdc++.h>

using namespace std;

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

int n , m , k ;
vector<pair<int,int> > graf[2001] ;
int dp[2001][16] ;
int t[16] ;
bool ubun[16] ;

void citire()
{
    int i , x , c , y ;
    fin >> n >> m ;
    fin >> k ;
    for ( i = 1 ; 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 solve()
{
    int nod , p , i , j ;
    queue<int> Q ;
    Q.push(1) ;
    for ( i = 1 ; i <= n ; i++ )
        for ( j = 0 ; j <= k ; j++ )
            dp[i][j] = 0x3f3f3f3f ;
    dp[1][0] = 0 ;
    p = 0 ;
    while(!Q.empty())
    {
        nod = Q.front() ;
        Q.pop() ;
        for ( i = 0 ; i < graf[nod].size() ; i++ )
        {
            if ( ubun[graf[nod][i].first] == true )
            {
                if ( dp[graf[nod][i].first][p+1] > dp[nod][p] + graf[nod][i].second )
                {
                    dp[graf[nod][i].first][p+1] = dp[nod][p] + graf[nod][i].second ;
                    p++ ;
                    Q.push(graf[nod][i].first) ;
                }
            }
            else if ( ubun[graf[nod][i].first] == false )
            {
                if ( dp[graf[nod][i].first][p] > dp[nod][p] + graf[nod][i].second )
                {
                    dp[graf[nod][i].first][p] = dp[nod][p] + graf[nod][i].second ;
                    Q.push(graf[nod][i].first) ;
                }
            }
        }
    }
    fout << dp[n][k] ;
}

int main()
{
    citire() ;
    solve() ;
}