Cod sursa(job #1118638)

Utilizator dumitrualexAlex Dumitru dumitrualex Data 24 februarie 2014 12:23:24
Problema Ubuntzei Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define nmax 2000+5
#define inf 1 << 25
using namespace std;

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

int n, m, k;
vector<int> prieteni;
vector<int> graf[nmax];
int dist[nmax][nmax];
int minim;

void citire()
{
    int x, y, c;


    fin >> n >> m;
    fin >> k;

    for (int i = 1; i <= k; i++)
    {
        fin >> x;
        prieteni.push_back(x);
    }

    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            dist[i][j] = inf;
    for (int i = 1; i <= m; i++)
    {
        fin >> x >> y >> c;

        dist[x][y] = c;
        dist[y][x] = c;
    }
}

void rezolvare()
{
    int t;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            for (int k = 1; k <= n; k++)
                dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
    minim = inf;

    if (prieteni.size() > 0)
    {
        do
        {
            t = dist[1][prieteni[0]];
            for (int i = 1; i < k; i++)
                t += dist[prieteni[i-1]][prieteni[i]];
            t += dist[prieteni[k-1]][n];

            minim = min(minim, t);
        } while (next_permutation(prieteni.begin(), prieteni.end()));
    }
    else
        minim = dist[1][n];

}

void afisare()
{
    fout << minim;
}

int main()
{
    citire();
    rezolvare();
    afisare();
    return 0;
}