Cod sursa(job #890980)

Utilizator SilviussMezei Silviu Silviuss Data 25 februarie 2013 12:59:56
Problema Ubuntzei Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>
using namespace std;

ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");

unsigned int a[2001][2001],s=200000000;
short n,k;
bool v[2001];

void bk(short i,short suma)
{
    short j;
    int aux;
    bool u=0;
    if(v[i]==1)
    {
        v[i]=0;
        u=1;
    }
    if(i==n)
    {
        for(j=2;j<n;j++)
            if(v[j]==1)
                goto loop;
        if(suma<s)
            s=suma;
    }
    else
    {
        for(j=1;j<=n;j++)
        {
            if(a[i][j]!=0)
            {
                aux=a[i][j];
                suma+=a[i][j];
                a[i][j]=0;
                bk(j,suma);
                suma-=aux;
                a[i][j]=aux;
            }
        }
    }
    if(u==1)
        v[i]=1;
    loop:;
}
int main()
{
    short m,i,j,x,y;
    fin>>n>>m>>k;
    for(i=0;i<k;i++)
    {
        fin>>x;
        v[x]=1;
    }
    for(i=0;i<m;i++)
    {
        fin>>x>>y;
        fin>>a[x][y];
        a[y][x]=a[x][y];
    }
    for(i=2;i<n;i++)
    {
        if(v[i]==0)
        {
            for(j=1;j<=n;j++)
            {
                if(a[i][j]>0)
                {
                    for(x=j+1;x<=n;x++)
                    {
                        if(a[j][x]==0 || a[i][j]+a[i][x]<a[j][x])
                        {
                            a[j][x]=a[i][j]+a[i][x];
                            a[x][j]=a[i][j]+a[i][x];
                        }
                    }
                    a[i][j]=0;
                    a[j][i]=0;
                }
            }
        }
    }
    bk(1,0);
    fout<<s;
}