Cod sursa(job #1117712)

Utilizator otnielMercea Otniel otniel Data 23 februarie 2014 19:08:36
Problema Ubuntzei Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<iostream>
using namespace std;
#include<stdio.h>
FILE *f,*g;
int n,m,a[2001][2001],i,j,k,z[2001],x,y,d,sol[2001],minim=9999;
int valid(int f)
{
    for(i=1;i<f;i++)
    if(sol[i]==sol[f])
    return 0;
    return 1;
}
int back(int f)
{
    if(f==k+1)
    {int suma=0;
        suma=suma+a[1][z[sol[1]]];
        for(i=1;i<k;i++)
        suma=suma+a[z[sol[i]]][z[sol[i+1]]];
        suma=suma+a[z[sol[k]]][n];
        if(suma<minim)
        minim=suma;
    }
    else
    {
        sol[f]=0;
        while(sol[f]<k)
        {
            sol[f]++;
            if(valid(f))
            back(f+1);
        }
    }
}
int drum()
{
    int t=0;
    for(t=1;t<=n;t++)
    for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    if(a[i][j]>a[i][t]+a[t][j])
    a[i][j]=a[i][t]+a[t][j];
}
int main()
{
    f=fopen("ubuntzei.in","r");
    g=fopen("ubuntzei.out","w");
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    if(i==j)
    a[i][j]=0;
    else
    a[i][j]=3200;
    fscanf(f,"%d",&k);
    for(i=1;i<=k;i++)
    fscanf(f,"%d",&z[i]);
    for(i=1;i<=m;i++)
    {
        fscanf(f,"%d%d%d",&x,&y,&d);
        a[x][y]=d;
        a[y][x]=d;
    }
    drum();
    back(1);
   fprintf(g,"%d",minim);
}