Cod sursa(job #1111428)

Utilizator svladScurtu Vlad svlad Data 18 februarie 2014 21:15:03
Problema Ubuntzei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include<fstream>
#include<iostream>
#include<algorithm>
#define INF 500000;
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int N,M,a[2005][2005],K,viz[20],nr[20],st,dr,perm[20];
long long prod;
void citire()
{
    int i,d,b,c,j;
    f>>N>>M;
    f>>K;
    for(i=1;i<=N;i++)
    {
        for(j=1;j<=N;j++) if(i!=j) a[i][j]=INF;
    }
    for(i=1;i<=K;i++) f>>nr[i];
    for(i=1;i<=M;i++)
    {
        f>>d>>b>>c;
        a[d][b]=c;
        a[b][d]=c;
    }
}
void RF()
{
    int i,j,z;
    for(z=1;z<=N;z++)
    {
        for(i=1;i<=N;i++)
        {
            for(j=1;j<=N;j++)
            {
                if(i!=j&&i!=z&&j!=z)
                {
                    if(a[i][z]+a[z][j]<a[i][j]) a[i][j]=a[i][z]+a[z][j];
                }
            }
        }
    }
}
int main()
{
    int i,j,OK,minim,v,S;
    citire();
    RF();
    st=1;
    dr=0;
    OK=0;
    prod=1;
    minim=99999999;
    for(i=1;i<=K;i++) perm[i]=i,prod=prod*i;
    for(i=1;i<=prod;i++)
    {   S=0; st=1; dr=perm[1];
        for(j=1;j<=K;j++)
        {
            S=S+a[st][nr[perm[j]]];
            st=nr[perm[j]];
        }
        S=S+a[st][N];
        if(S<minim) minim=S;
        next_permutation(perm+1,perm+K+1);
    }
    g<<minim;
    f.close();
    g.close();
    return 0;
}