Cod sursa(job #1806782)

Utilizator NiceDayCraciun Mihai NiceDay Data 15 noiembrie 2016 18:02:12
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <iostream>
#include <fstream>
#define MAX 1000000000
using namespace std;

ifstream f_in("ubuntzei.in");
ofstream f_out("ubuntzei.out");
int N,M,k,C[2002],a[2001][2001],p[2001][2001],s[2001][2001],d_max=MAX,stiva[20];
long long d[2001][2001];
void init(){
    for(int i=1;i<=N;i++)
        for(int j=1;j<=N;j++)
            a[i][j]=MAX;
}

void citire(){
int drum,x,y;
for(int i=1;i<=k;i++)
    {f_in>>C[i];}
for(int i=1; i<=M; i++)
       {
         f_in>>x>>y>>drum;
         if((a[x][y]==MAX || drum < a[x][y]) && x!=y){
            a[x][y]=a[y][x]=drum;}
       }
    f_in.close();
}

void dijkstra(int x){ int i,j; long long min,y;   s[x][x]=1;
  for(i=1;i<=N;i++)
  { d[x][i]=a[x][i];
    if(i!=x && d[x][i]<MAX) p[x][i]=x;}
   for(i=1;i<=N-1;i++)
     {  for(j=1,min=MAX;j<=N;j++)
           if(s[x][j]==0 && d[x][j]<min) { min=d[x][j];y=j;}
        s[x][y]=1;
        for(j=1;j<=N;j++)
           {if(s[x][j]==0 && d[x][j]>d[x][y]+a[y][j]) {d[x][j]=d[x][y]+a[y][j]; p[x][j]=y;}
            d[j][x]=d[x][j];}
     }
}


int valid(int temp){
    for(int i=1;i<temp;i++)
        if(stiva[i]==stiva[temp])
            return 0;
    return 1;
}
int solutie(int temp){return temp==k;}
void tipar(){
    int drum=0;
    for(int i=0;i<=k;i++)
        drum+=d[stiva[i]][stiva[i+1]];
    if(drum<d_max)
        d_max=drum;
}
void bk(int temp){
    for(int i=1;i<=k;i++){
        stiva[temp]=C[i];
        if(valid(temp))
            if(solutie(temp)) tipar();
            else bk(temp+1);
    }

}
int main()
{
    f_in>>N;
    f_in>>M;
    f_in>>k;
    init();
    citire();
    if(k==0){dijkstra(1); f_out<<d[1][N];}
    else{
        for(int i=1;i<=k;i++)
            dijkstra(C[i]);

        stiva[0]=1;
        stiva[k+1]=N;
        bk(1);
        f_out<<d_max;
    }
    return 0;
}