Cod sursa(job #864530)

Utilizator costi_.-.Costinnel costi_.-. Data 25 ianuarie 2013 09:24:24
Problema Ubuntzei Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include<fstream>
#include<iostream>
#define nmax 2001
#define kmax 20
#define inf 0x3f3f3f3f
using namespace std;

int A[nmax][nmax],ST[kmax],VZ[kmax],P[kmax];
int N,M,K,L;

void citeste()
{
    ifstream f("ubuntzei.in");
    int i,x,y,z,j;
    f>>N>>M;
    f>>K;
    for(i=1;i<=K;i++)
    f>>P[i];

    for(i=1;i<=N;i++)
     for(j=1;j<=N;j++)
       A[i][j]=inf;

    for(i=1;i<=M;i++)
    {
        f>>x>>y>>z;
        A[x][y]=z;
        A[y][x]=z;
    }

    f.close();
}

void afisare()
{
    for(int i=1;i<=K;i++)
    cout<<ST[i]<<' ';
    cout<<'\n';
}

void RoyFloyd()
{
    int i,j,k;

    for(k=1;k<=N;k++)
     for(i=1;i<=N;i++)
       for(j=1;j<=N;j++)
       if(i!=k && j!=k)
         if(A[i][j]>A[i][k]+A[k][j])
            A[i][j]=A[i][k]+A[k][j];
}

int valid(int k)
{
    for(int i=1;i<=k-1;i++)
    if(ST[i]==ST[k])
    return 0;

    return 1;
}

void determina(int k)
{
    int i,s;

    //afisare();

    s=A[1][P[ST[1]]];
    for(i=1;i<=k-1;i++)
    s+=A[P[ST[i]]][P[ST[i+1]]];

    s+=A[P[ST[k]]][N];

    if(s<L)
    L=s;
}

void backtrack(int k)
{
    int i;
    for(i=1;i<=K;i++)
    {
        ST[k]=i;
        if(valid(k))
         if(k==K)
           determina(k);
           else
           {
               backtrack(k+1);
               //VZ[ST[k]]=0;
           }
    }
}

void rezolva()
{
    L=inf;

    RoyFloyd();
    backtrack(1);
}

void scrie()
{
    ofstream g("ubuntzei.out");

    g<<L<<'\n';

    g.close();
}

int main()
{
    citeste();
    rezolva();
    scrie();
    return 0;
}