Cod sursa(job #1837773)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 30 decembrie 2016 14:16:35
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <climits>

using namespace std;

const long long inf = (LONG_LONG_MAX / 2) - 1;

int n, m;
long long vecini[2005][2005];
int muchiiObligatorii[20];
int k;
int permutari[20];
int viz[2005];
long long distMin = inf;

void citire()
{
    scanf("%d %d", &n, &m);

    scanf("%d", &k);

    for(int i = 0; i < k; i++)
    {
        scanf("%d", &muchiiObligatorii[i]);
        muchiiObligatorii[i]--;

        if(muchiiObligatorii[i] == 0 || muchiiObligatorii[i] == n - 1)
        {
            i--;
            k--;
        }
    }

    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            vecini[i][j] = inf;
        }
    }

    int tmp1, tmp2, tmp3;

    for(int i = 0; i < m; i++)
    {
        scanf("%d %d %d", &tmp1, &tmp2, &tmp3);
        tmp1--;
        tmp2--;
        vecini[tmp1][tmp2] = (long long)tmp3;
        vecini[tmp2][tmp1] = (long long)tmp3;
    }
}

void royFloyd()
{
    for(int x = 0; x < n; x++)
    {
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < n; j++)
            {
                if(x != i && x != j && i != j)
                {
                    if(vecini[i][j] > vecini[i][x] + vecini[x][j])
                    {
                        vecini[i][j] = vecini[i][x] + vecini[x][j];
                    }
                }
            }
        }
    }
}

void solve()
{
    long long dist = 0;
    dist += vecini[0][permutari[0]];

    for(int i = 0; i < k - 1; i++)
    {
        dist += vecini[permutari[i]][permutari[i + 1]];

        if(dist > inf)
        {
            return;
        }
    }

    dist += vecini[permutari[k - 1]][n - 1];

    if(dist < distMin)
    {
        distMin = dist;
    }
}

void generarePermutari(int x)
{
    if(x == k)
    {
        solve();
    }
    else
    {
        for(int i = 0; i < k; i++)
        {
            if(viz[muchiiObligatorii[i]] == false)
            {
                viz[muchiiObligatorii[i]] = true;
                permutari[x] = muchiiObligatorii[i];
                generarePermutari(x + 1);
                viz[muchiiObligatorii[i]] = false;
            }
        }
    }
}

int main()
{
    freopen("ubuntzei.in", "r", stdin);
    freopen("ubuntzei.out", "w", stdout);

    citire();
    royFloyd();

    if(k == 0)
    {
        printf("%d", vecini[0][n - 1]);
    }
    else
    {
        generarePermutari(0);
        printf("%lld", distMin);
    }

    return 0;
}