Cod sursa(job #2999942)

Utilizator TUDORBRKTudor Berechet TUDORBRK Data 11 martie 2023 19:03:15
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 kb

#include <iostream>
#include <fstream>
#define INTMAX 10000

using namespace std;
ifstream f("date.in");

int n, m, k;
int v[100], dist[100], a[100][100];
int dp[1<<15][15];

bool sptSet[100];

void afisare(int V[100], int N)
{
    for(int i = 1; i <= N; i++)
        cout<<V[i]<<" ";
    cout<<endl;
}

int minDist()
{
    int mini = INTMAX, nodMin;

    for(int i =  1; i <= n; i++)
    {
         if(mini > dist[i] && sptSet[i] == false)
         {
             mini = dist[i];
             nodMin = i;
         }
    }

    return nodMin;
}

void dijkstra(int nod, int V[100])
{
    for(int i = 1; i <= n; i++)
            dist[i] = INTMAX, sptSet[i] = false;

    dist[nod] = 0;

    for(int contor = 1; contor < n; contor++)
    {
        int curent = minDist();
        sptSet[curent] = true;

        for(int i = 1; i <= n; i++)
        {
            if(sptSet[i] == false && dist[i] > dist[curent] + a[curent][i] && a[curent][i])
                dist[i] = dist[curent] + a[curent][i];
        }
    }

    for(int i = 1; i <= n; i++)
        V[i] = dist[i];
}

int main()
{
    f>>n>>m;
    f>>k;
    for(int i = 0; i < k; i++)
        f>>v[i];
    for(int i = 0; i < m; i++)
    {
        int x, y, d;
        f>>x>>y>>d;
        a[x][y] = a[y][x] = d;
    }

    int path[100][100] = {0};

    dijkstra(1, path[1]);
    for(int i = 0; i < k; i++)
        dijkstra(v[i], path[i]);

    for(int i = 1; i < (1<<k); i++)
    {
        int j = 0;
        for(j = 0; j < k; j++)
            if(i == (1<<j))
                break;

        if(i == (1<<j) && j < k)
        {
            dp[i][j] = path[1][v[j]];
            continue;
        }

        for(j = 0; j < k; j++)
        {
            dp[i][j] = INTMAX;
            if(i & (1<<j)) {
                for(int t = 0; t < k; t++)
                {
                    if(t != j && (i & (1<<t)))
                        dp[i][j] = min(dp[i][j], dp[i - (1<<j)][t] + path[t][v[j]]);
                }
            }
        }
    }

    int mini = INTMAX;
    for(int i = 0; i < k; i++)
    {
        mini = min(mini, dp[(1<<k) - 1][i] + path[i][n]);
    }

    for(int i = 0; i < k; i++)
    {
        for(int j = 1; j <= n; j++)
            cout<<path[i][j]<<" ";
        cout<<endl;
    }

    cout<<endl<<mini;
}