Cod sursa(job #1896568)

Utilizator geo_furduifurdui geo geo_furdui Data 28 februarie 2017 19:20:41
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <fstream>
#include<climits>
using namespace std;
ifstream cin ("ubuntzei.in");
ofstream cout ("ubuntzei.out");
int n,m,k,noduri[20],coada[20010],nr,h;
int dist[20][2010];
int sol[20][66010];
int start[2020];
struct bla
{
    int varf,binar;
} coada2[1000000];
struct awesome
{
    int nod,urm,cost;
} t[20100];
void read ()
{ int a,b,c,p=0;
    cin>>n>>m>>k;
    noduri[0]=1;
    for(int i=1;i<=k;++i) cin>>noduri[i];
    for(int i=1;i<=m;i++)
    {
        cin>>a>>b>>c;
        t[++p].nod=b; t[p].cost=c; t[p].urm=start[a]; start[a]=p;
        t[++p].nod=a; t[p].cost=c; t[p].urm=start[b]; start[b]=p;
    }
    int r=1;
    for(int i=0;i<=k;i++) h=h+r,r*=2;
}
void init ()
{
    for(int i=0;i<=k;i++)
        for(int j=1;j<=n;j++)
           dist[i][j]=INT_MAX;
}
void ford (int varful)
{   dist[nr][varful]=0;
    int pi=1,ps=1;
    coada[1]=varful;
    while(ps<=pi)
    {
        int x=start[coada[ps]];
        while(x)
        {
            if(dist[nr][coada[ps]]+t[x].cost<dist[nr][t[x].nod])
                dist[nr][t[x].nod]=dist[nr][coada[ps]]+t[x].cost,coada[++pi]=t[x].nod;
            x=t[x].urm;
        } ++ps;
    }
}
void construct_lungimi ()
{
    for(nr=0;nr<=k;++nr)
        ford(noduri[nr]);
}
void init2 ()
{ int y=1<<(k+1);
    for(int i=0;i<=k;i++)
        for(int j=1;j<=y;j++)
            sol[i][j]=INT_MAX;
}
void a_different_kind_of_ford ()
{
    int pi=1,ps=1;
    coada2[1].varf=0;
    coada2[1].binar=1;
    sol[0][1]=0;
    while(ps<=pi)
    {
        for(int i=1;i<=k;i++)
        { int w=1<<i;
            if(coada2[ps].varf!=i)
            {
                int binary=coada2[ps].binar | w;
                if(sol[coada2[ps].varf][coada2[ps].binar]+dist[coada2[ps].varf][noduri[i]]<sol[i][binary])
                    sol[i][binary]=sol[coada2[ps].varf][coada2[ps].binar]+dist[coada2[ps].varf][noduri[i]],coada2[++pi].varf=i,coada2[pi].binar=binary;
            }
        } ++ps;
    }
}
void write ()
{ int maxim=INT_MAX;
    for(int i=0;i<=k;i++)
        if( sol[i][h]!=INT_MAX && sol[i][h]+dist[i][n]<maxim ) maxim=sol[i][h]+dist[i][n];
    cout<<maxim<<"\n";
}
int main()
{
    read();
    init();
    init2();
    construct_lungimi();
    a_different_kind_of_ford();
    write();
    cin.close();
    cout.close();
    return 0;
}