Cod sursa(job #1848017)

Utilizator dragos_vecerdeaVecerdea Dragos dragos_vecerdea Data 15 ianuarie 2017 12:54:23
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <stdio.h>
using namespace std;
FILE *fin = fopen("ubuntzei.in", "r");
FILE *fout = fopen("ubuntzei.out", "w");
char folos[203];
int n,m;
int minim=1000000000,interesanti;
int interes[203];
int sol[203];
int c[203][203];
void afisare()
{
    int actual=0;
    for(int i=1;i<=interesanti+1;i++)
    {
        actual+=c[sol[i-1]][sol[i]];
    }
    if(actual<minim)minim=actual;
}
void bkt(int p)
{
    if(p>interesanti) afisare();
    else
    {
        for(int i=1;i<=interesanti;i++)
        {
            if(folos[i]==0)
            {
                folos[i]=1;
                sol[p]=interes[i];
                bkt(p+1);
                folos[i]=0;
            }
        }
    }
}
int main()
{
    fscanf(fin, "%d%d", &n, &m);
    fscanf(fin, "%d", &interesanti);
    for(int i=1;i<=interesanti;i++)
    {
        fscanf(fin, "%d", &interes[i]);
    }
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        fscanf(fin, "%d%d%d", &x,&y,&z);
        c[x][y]=z;
        c[y][x]=z;
    }
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
    {
        if(c[i][k]!=0 && c[k][j]!=0 && (c[i][j] > c[i][k] + c[k][j] || c[i][j]==0) && i!=j) c[i][j]=c[i][k]+c[k][j];
    }
    sol[0]=1;
    sol[interesanti+1]=n;
    bkt(1);
    for(int i=1;i<=interesanti;i++)
    {
        c[0][interes[i]]=0;
        c[interes[i]][interesanti+1]=0;
    }
    fprintf(fout, "%d", minim);
    return 0;
}