Cod sursa(job #1761377)

Utilizator tudorgalatanRoman Tudor tudorgalatan Data 22 septembrie 2016 09:28:21
Problema Ubuntzei Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <fstream>
#include <climits>

using namespace std;

void dijkstra (unsigned short int K);

unsigned short int N, M;
unsigned short int K;
unsigned short int C[2001];
unsigned short int x[2001], y[2001];
unsigned int z[2001];

unsigned int matrix[10005][20];
unsigned int dist[2005][2005];
unsigned int minimum;
unsigned int i, j, w;

unsigned long int L;

int main ()
{
    ifstream fin ("ubuntzei.in");
    fin >> N >> M;
    fin >> K;
    for (i=0; i<K; i++)
        fin >> C[i];
    for (i=1; i<=M; i++)
        fin >> x[i] >> y[i] >> z[i];
    fin.close();
    minimum = UINT_MAX;
    if (K > 0)
    {
        for (i=0; i<K; i++)
            dijkstra(C[i]);
        for (i=1; i<(1<<K); i++)
            for (j=0; j<K; j++)
                matrix[i][j] = UINT_MAX;
        for (i=0; i<K; i++)
            matrix[(1<<i)][i] = dist[1][C[i]];
        for (i=1; i<(1<<K); i++)
            for (j=0; j<K; j++)
                if (i & (1<<j))
                {
                    for (w=0; w<K; w++)
                        if (w != j && (i & (1<<w)))
                            matrix[i][j] = min(matrix[i][j],matrix[i^(1<<j)][w]+dist[C[w]][C[j]]);
                }
        for (i=0; i<K; i++)
            if (matrix[(1<<K)-1][i] + dist[C[i]][N] < minimum)
                minimum = matrix[(1<<K)-1][i] + dist[C[i]][N];
        L = minimum;
    }
    else
    {
        dijkstra(N);
        L = dist[1][N];
    }
    ofstream fout ("ubuntzei.out");
    fout << L;
    fout.close();
    return 0;
}

void dijkstra (unsigned short int K)
{
    unsigned short int i;
    bool okay;
    unsigned int dist1[2001];
    for (i=1; i<=N; i++)
        dist1[i] = UINT_MAX;
    dist1[K] = 0;
    okay = 1;
    while (okay)
    {
        okay = 0;
        for (i=1; i<=M; i++)
        {
            if (dist1[x[i]] < UINT_MAX)
                if (dist1[x[i]] + z[i] < dist1[y[i]] && y[i] != K)
                {
                    okay = 1;
                    dist1[y[i]] = dist1[x[i]] + z[i];
                }
            if (dist1[y[i]] < UINT_MAX)
                if (dist1[y[i]] + z[i] < dist1[x[i]] && x[i] != K)
                {
                    okay = 1;
                    dist1[x[i]] = dist1[y[i]] + z[i];
                }
        }
    }
    for (i=1; i<=N; i++)
        dist[K][i] = dist[i][K] = dist1[i];
}