Cod sursa(job #2165726)

Utilizator CozmaCatalinCozma Catalin CozmaCatalin Data 13 martie 2018 13:23:30
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <bits/stdc++.h>

std::ifstream in("ubuntzei.in");
std::ofstream out("ubuntzei.out");

using namespace std;
const int MAX = 2000;
int st [ MAX + 1 ];
int ST[MAX];
  int countt = 0;
int Matrix [ MAX + 1 ][ MAX + 1 ];
int N,M,K;
int V[ MAX + 1 ];
     int Answer = ( 1<< 20);

inline void scanDATA()
{
    in >> N >> M >> K;
    for ( int i = 1; i <= K ; ++i)
        in >> V[i];
            for ( int i = 1; i <= N ; ++i)
        for ( int j = 1; j <= N ; ++j)
        if( i == j) Matrix[i][j] = 0;
       else Matrix[i][j] = (1<<20);

    for ( int i = 1; i <= M ; ++i)
    {
        int x,y,price;
        in >> x >> y >> price;
       Matrix[x][y] = price;
       Matrix[y][x] = price;
    }
}

void print(int nivel)
{
  int NR = 0;
  NR+=Matrix[1][st[1]];
  for ( int i = 1; i < nivel ; ++i)
    NR+=Matrix[st[i]][st[i+1]];
  NR += Matrix[st[nivel]][N];

  if(NR < Answer)
    Answer=  NR;
}
bool valid(int nivel)
{
    for(int i=1;i<=nivel-1;++i)
        if(st[i]==st[nivel])
            return false;
    return true;
}
void backtr(int nivel)
{
    for(int i=1;i<=K;++i)
    {
        st[nivel]=V[i];
        if(valid(nivel))
        {
            if(nivel==K)
            {
                print(nivel);
            }
            else
            {
                backtr(nivel+1);
            }
        }
    }
}

void Floyd()
{
    for ( int k = 1; k <= N ; ++k)
        for ( int i = 1; i <= N ; ++i)
        for ( int j = 1 ; j <= N ; ++j)
        if( i != j)
          if(Matrix[i][j] > Matrix[i][k] + Matrix[k][j])
            Matrix[i][j] = Matrix[i][k] + Matrix[k][j];


}

int main()
{
    scanDATA();
     Floyd();
     if( K == 0)
        out << Matrix[1][N];
     else
     {
   backtr(1);
    /* for ( int i = 1; i <= N ; ++i)
     {for ( int j = 1; j <= N ; ++j)
         cout << Matrix[i][j] <<" ";
         cout << endl;}*/
         out << Answer;
     }


}