Cod sursa(job #1759790)

Utilizator geralt_of_riviajohn nathalis geralt_of_rivia Data 19 septembrie 2016 20:34:41
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.58 kb
#include <fstream>
#include<climits>
using namespace std;
ifstream cin ("ubuntzei.in");
ofstream cout ("ubuntzei.out");
int d[16][33003],a[18][2002],z[20],coada_m[100001],n,m,k,t[3][20002],start[2002],o,viz[2002],q[2002],b[16][33000],maxx=INT_MAX;
struct bla
{
    int nod,nr;
} coada[300001];
void read ()
{ int x,y,r,k1=0;
    cin>>n>>m>>k;
    for(int i=1;i<=k;i++)
          cin>>z[i],q[z[i]]=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_m[1]=nod; a[o][nod]=0;
    while(ps<=pi)
    {
        int x=start[coada_m[ps]];
        while(x)
        {
            if(a[o][coada_m[ps]]+t[2][x]<a[o][t[0][x]])
            {
                a[o][t[0][x]]=a[o][coada_m[ps]]+t[2][x]; if(viz[t[0][x]]==0) coada_m[++pi]=t[0][x]; viz[t[0][x]]=1;
            } x=t[1][x];
        }  ps++; viz[coada_m[ps]]=0;
    }
}
void construct_man ()
{
    for(o=1;o<=k;o++)
        ford(z[o]);
    ford(1); o++;
    ford(n);
}
void init ()
{
    for(int i=1;i<=k+2;i++)
           for(int j=1;j<=n;j++)
               a[i][j]=INT_MAX;
    for(int i=0;i<=k;i++)
           for(int j=0;j<=33000;j++)
                d[i][j]=INT_MAX;
}
void up_date_here_man (int nrct,int nod,int &pi)
{
    for(int i=1;i<=k;i++)
    {
        if(q[nod]!=i)
        { int nrcrt=nrct | (1<<(i-1));
            if(d[q[nod]][nrct]+a[q[nod]][z[i]]<d[i][nrcrt])
            {
                d[i][nrcrt]=d[q[nod]][nrct]+a[q[nod]][z[i]]; if(b[i][nrcrt]==0) {coada[++pi].nod=z[i]; coada[pi].nr=nrcrt;} b[i][nrcrt]=1;
            }
        }
    }
}
void up_date_coada_man (int &pi)
{
    for(int i=1;i<=k;i++)
    { int limit=1<<(i-1);
        d[i][limit]=a[k+1][z[i]]; coada[++pi].nod=z[i]; coada[pi].nr=1<<(i-1);
    }
}
void ford_smecher ()
{
    int pi=0,ps=1;
    d[0][0]=0;  up_date_coada_man (pi);
    while(ps<=pi)
    {
        up_date_here_man(coada[ps].nr,coada[ps].nod,pi);
        ps++; b[q[coada[ps].nod]][coada[ps].nr]=0;
    }
}
int calc ()
{ int p=1,s=0;
    for(int i=0;i<k;i++)
    {
        s+=p; p*=2;
    }
    return s;
}
void write ()
{ int limit=calc();
    for(int i=1;i<=k;i++)
    {
        if(d[i][limit]+a[o][z[i]]<maxx) maxx=d[i][limit]+a[o][z[i]];
    }
    cout<<maxx;
}
void k_0 ()
{
    cout<<a[1][n];
}
int main()
{
    read();
    init();
    construct_man();
    if(k==0) k_0();
    else {
    ford_smecher();
    write();}
    return 0;
}