Cod sursa(job #2523291)

Utilizator AltexStefanButacu Stefan AltexStefan Data 13 ianuarie 2020 21:44:26
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <bits/stdc++.h>
#define NMAX 2005
#define inf 1 << 29
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int G[NMAX][NMAX];
int K,M,N;
int Oras_Pr[20];
void citire()
{

    f>> N >> M;
    f >> K;
    for(int i =1 ; i <= K ;i++)
        f >> Oras_Pr[i];

    for(int i = 1; i <= N;i++)
        for(int j = 1 ; j <= N ; j++)
           if(i != j ) G[i][j] = inf;
           else G[i][j] = 0;

    for(int i = 1; i <= M ; i++)
    {
        int x,y,cost;
        f >> x >> y >> cost;
        G[x][y]= cost;
        G[y][x]= cost;
    }
}
void Roy_Floyd()
{
    int k,i,j;
    for(k = 1 ; k <= N ; k++)
    {
        for(i = 1 ; i <= N ; i++)
            for(j = 1 ; j <= N ;j++)
                if(G[i][j] > G[i][k] + G[k][j])
                    G[i][j] = G[i][k] + G[k][j];
    }
}
int dim,permutare[20];
int Traseu(int *permutare,int dim)
{
    int cost = 0;
    permutare[0] = 1;
    permutare[dim + 1 ] = N;
    for(int i = 0 ; i <= K ; i++)
        cost += G[permutare[i]][permutare[i+1]];
    return cost;
}
bool valid(int Numar)
{
    for(int i = 1 ; i < dim ; i++)
        if(permutare[i] == Numar)
            return false;
    return true;
}
int cost_final = inf;
void GenerarePerm(int dim)
{
    int i,cost;
    for(i = 1 ; i <=K ; i++)
    {
        permutare[dim] = Oras_Pr[i];
        if(valid(Oras_Pr[i]))
        {
            if( dim == K )
            {
                cost = Traseu ( permutare , dim);
                if(cost < cost_final)
                    cost_final = cost;
            }
            else
                GenerarePerm(dim + 1);
        }
    }
}
int main()
{
    citire();
    Roy_Floyd();
    GenerarePerm(1);
    g<< cost_final;
    return 0;
}