Cod sursa(job #1356658)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 23 februarie 2015 15:24:26
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <fstream>
#include <vector>
#define INF 0x3f3f3f3f
using namespace std;

ifstream is("ubuntzei.in");
ofstream os("ubuntzei.out");

int n, m, k;
vector<int> ub;
vector<vector<vector<int> > > c;

void Read();
void Solve();

int main()
{
    Read();
    Solve();
    is.close();
    os.close();
    return 0;
}

void Solve()
{
    for ( int i = 1; i <= n; ++i )
        c[i][i][(1 << ub[i]) | 1] = 0;
    for ( int k = 1; k <= n; ++k )
        for ( int i = 1; i <= n; ++i )
            for ( int j = 1; j <= n; ++j )
            {
                if ( i == j )
                    continue;
                for ( int mi = 1; mi < ( 1 << (k + 1) ); mi += 2)
                if ( mi & (1<<ub[i]) )
                    for ( int mj = 1; mj < ( 1 << (k + 1) ); mj += 2 )
                    if ( mj & (1<<ub[j]) )
                   // {
                        c[i][j][mi | mj] = min(c[i][j][mi | mj], c[i][k][mi] + c[k][j][mj]);
                      // os << c[i][j][mi | mj] << "\n";}
            }
    os << c[1][n][(1 << (k + 1)) - 1] << "\n";
}

void Read()
{
    is >> n >> m >> k;
    ub = vector<int>(n + 1);
    int n1, n2, cost;
    for ( int i = 1; i <= k; ++i )
    {
        is >> n1;
        ub[n1] = i;
    }
    c = vector<vector<vector<int> > >(n + 1, vector<vector<int> >(n + 1, vector<int>(1 << 17, INF)));
    for ( int i = 1; i <= m; ++i )
    {
        is >> n1 >> n2 >> cost;
        c[n1][n2][(1 << ub[n1]) | (1 << ub[n2]) | 1] = c[n2][n1][(1 << ub[n1]) | (1 << ub[n2]) | 1] = cost;
    }
}