Cod sursa(job #1759651)

Utilizator geralt_of_riviajohn nathalis geralt_of_rivia Data 19 septembrie 2016 17:50:58
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <fstream>
#include<climits>
using namespace std;
ifstream cin ("ubuntzei.in");
ofstream cout ("ubuntzei.out");
int a[16][2002],x[16],n,m,k,z[20],t[3][20001],start[2002],coada[100001],o,maxx=INT_MAX,s=0,v[20];
void read ()
{ int x,y,r,k1=0;
    cin>>n>>m>>k;
    for(int i=1;i<=k;i++)
           cin>>z[i];
           for(int i=1;i<=m;i++)
           { cin>>x>>y>>r;
               t[0][++k1]=y; t[2][k1]=r; t[1][k1]=start[x]; start[x]=k1;
               t[0][++k1]=x; t[2][k1]=r; t[1][k1]=start[y]; start[y]=k1;
            }
}
void ford (int nod)
{
    int pi=1,ps=1;
    coada[ps]=nod; a[o][nod]=0;
    while(ps<=pi)
    {
        int x=start[coada[ps]];
        while(x)
        {
            if(a[o][coada[ps]]+t[2][x]<a[o][t[0][x]])
             {
                 a[o][t[0][x]]=a[o][coada[ps]]+t[2][x]; coada[++pi]=t[0][x];
             } x=t[1][x];
        } ps++;
    }
}
void init ()
{
    for(int i=1;i<=k+2;i++)
        for(int j=1;j<=n;j++)
           a[i][j]=INT_MAX;
}
void construct_man ()
{
    for(o=1;o<=k;o++)
        ford(z[o]);
        ford(1);
        o++; ford(n);
}
void verif_man ()
{
    if(s+a[k+1][z[x[1]]]+a[k+2][z[x[k]]]+a[x[k-1]][z[x[k]]]<maxx) maxx=s+a[k+1][z[x[1]]]+a[k+2][z[x[k]]]+a[x[k-1]][z[x[k]]];
}
void up_date_man (int k1)
{
     if(k1>1)
        s+=a[x[k1-1]][z[x[k1]]];
}
void up_date_man_minus (int k1)
{
        s-=a[x[k1-1]][z[x[k1]]];
}
void bkt ()
{
    int k1=1;
    while(k1)
    {
        if(x[k1]<k)
        { x[k1]++;
            if(v[x[k1]]==0)
            {
                if(k1==k) verif_man();
                else { up_date_man(k1),v[x[k1]]=1,x[++k1]=0;}
            }
        }
        else {k1--,v[x[k1]]=0,up_date_man_minus(k1);}
    }
}
void write ()
{
    cout<<maxx;
}
int main()
{
    read();
    init();
    construct_man();
    if(k>0)
    bkt();
    else maxx=a[1][n];
    write();
    cin.close();
    cout.close();
    return 0;
}