Cod sursa(job #1649047)

Utilizator dnprxDan Pracsiu dnprx Data 11 martie 2016 12:25:08
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <bits/stdc++.h>
#define oo 30000000
using namespace std;

int a[2002][2002], n, solMin;
int t[20], k, st[20], viz[20];

void Citire()
{
    int i, j, x, y, c, m;
    ifstream fin("ubuntzei.in");
    fin >> n >> m;
    fin >> k;
    for (i = 1; i <= k; ++i)
        fin >> t[i];
    for (i = 1; i <= n; ++i)
        for (j = 1; j <= n; ++j)
            a[i][j] = oo;
    for (i = 1; i <= n; ++i)
        a[i][i] = 0;
    for (i = 1; i <= m; ++i)
    {
        fin >> x >> y >> c;
        a[x][y] = a[y][x] = c;
    }
    fin.close();
}

void FloydWarshall()
{
    int i, j, p;
    for (p = 1; p <= n; ++p)
      for (i = 1; i <= n; ++i)
        if (i != p)
          for (j = 1; j <= n; ++j)
            if (i != j && j != p)
                a[i][j] = min(a[i][j],a[i][p]+a[p][j]);

}

void Solutie()
{
    int sol, i;
    if (k == 0)
    {
        solMin = a[1][n];
        return ;
    }
    sol = a[1][t[st[1]]];
    for (i = 2; i <= k; ++i)
        sol += a[t[st[i-1]]][t[st[i]]];
    sol += a[t[st[k]]][n];
    solMin = min(solMin, sol);
}

void Perm(int top)
{
    int i;
    if (top == k + 1) Solutie();
    else for (i = 1; i <= k; ++i)
            if (viz[i] == 0)
    {
        viz[i] = 1;
        st[top] = i;
        Perm(top + 1);
        viz[i] = 0;
    }
}

int main()
{
    Citire();
    FloydWarshall();
    solMin = oo;
    Perm(1);
    ofstream fout("ubuntzei.out");
    fout << solMin << "\n";
    fout.close();
    return 0;
}