Cod sursa(job #1759172)

Utilizator geralt_of_riviajohn nathalis geralt_of_rivia Data 18 septembrie 2016 16:33:55
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 kb
#include <fstream>
#include<climits>
using namespace std;
ifstream cin ("ubuntzei.in");
ofstream cout ("ubuntzei.out");
int a[16][33000],d[2002],n,m,k,v[2002],t[3][20002],coada_mica[200001],start[2002],ppi=1,h[2002],q,limit,e[20],maxx=INT_MAX;
bool viz_mic[2002];
struct bla
{
    int nod,nr;
} coada_mare[200001];
void read ()
{ int c,x,y,z,k1=0;
    cin>>n>>m>>k;
    for(int i=1;i<=k;i++)  cin>>c,v[c]=i,e[i]=c;
    for(int i=1;i<=m;i++)
    {
        cin>>x>>y>>z;
        t[0][++k1]=y; t[2][k1]=z; t[1][k1]=start[x]; start[x]=k1;
        t[0][++k1]=x; t[2][k1]=z; t[1][k1]=start[y]; start[y]=k1;
    }
}
void init ()
{ int p=1;
    for(int i=0;i<k;i++)
    {
        limit+=p; p*=2;
    }
    for(int i=0;i<=k;i++)
         for(int j=0;j<=limit;j++)
               a[i][j]=INT_MAX;
}
void pune_in_coada_mare (int nodd,int nrct,int z)
{
    int c=nrct | 1<<(v[nodd]-1);
     if(z>=a[v[nodd]][c]) return; a[v[nodd]][c]=z;
     coada_mare[++ppi].nod=nodd;
     coada_mare[ppi].nr=c;
}
void ford (int nodd)
{
       int pi=1,ps=1; coada_mica[1]=nodd; d[nodd]=0;
    while(ps<=pi)
    {
        int x=start[coada_mica[ps]];
        while(x)
        {
            if(d[coada_mica[ps]]+t[2][x]<d[t[0][x]] || h[t[0][x]]<q)
            { h[t[0][x]]=q;
                d[t[0][x]]=d[coada_mica[ps]]+t[2][x]; coada_mica[++pi]=t[0][x];
            } x=t[1][x];
        } ps++;
    }
}
void ford_secundar (int nodd,int nrct)
{
    int pi=1,ps=1; coada_mica[1]=nodd; if(nodd==1) d[nodd]=0; else  d[nodd]=a[v[nodd]][nrct];
    while(ps<=pi)
    {
        int x=start[coada_mica[ps]];
        while(x)
        {
            if(d[coada_mica[ps]]+t[2][x]<d[t[0][x]] || h[t[0][x]]<q)
            { h[t[0][x]]=q;
                d[t[0][x]]=d[coada_mica[ps]]+t[2][x]; if(viz_mic[t[0][x]]==0) coada_mica[++pi]=t[0][x]; viz_mic[t[0][x]]=1;
                if(v[t[0][x]]!=0) pune_in_coada_mare(t[0][x],nrct,d[t[0][x]]);
            } x=t[1][x];
        }  ps++;viz_mic[coada_mica[ps]]=0;
    }
}
void ford_principal ()
{
    int ps=1;
    coada_mare[1].nod=1; coada_mare[1].nr=0;
    while(ps<=ppi)
    { q++;
        ford_secundar(coada_mare[ps].nod,coada_mare[ps].nr);
        ps++;
    }
}
void write ()
{
    for(int i=1;i<=k;i++)
    { q++;
        ford(e[i]);
        if(a[i][limit]+d[n]<maxx) maxx=a[i][limit]+d[n];
    }
    cout<<maxx;
}
void k_0 ()
{ q=1;
    ford_secundar(1,1);
    cout<<d[n];
}
int main()
{
   read();
   init();
   if(k>0)
   {
    ford_principal();
    write();
   }
   else k_0();
    return 0;
}