Cod sursa(job #1247356)

Utilizator heracleRadu Muntean heracle Data 22 octombrie 2014 17:42:12
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <cstdio>
#include <queue>
#include <cstring>

FILE* in=fopen("ubuntzei.in","r");
FILE* out=fopen("ubuntzei.out","w");

const int Q=2009,INF=2000000000;

int nod,muc,k;
int v[20];

int d[20][20];

int m[Q][Q];

int dist[Q][Q];


int c[1<<16][Q];










int inline min(const int &a, const int &b)
{
    return a<b?a:b;
}

void partea2()
{
    for(int i=1; i<=k; i++)
    {
        for(int j=1; j<=k; j++)
        {
            if(dist[i][j]==0)
                dist[i][j]=INF;
        }
    }

    for(int i=0; i<(1<<k); i++)
    {
        for(int j=1; j<=k; j++)
        {
            c[i][j]=INF;
        }
    }

    c[1][0]=0;

    for(int i=0;i<(1<<k);i++)
        for(int j=1;j<=k;j++)
            if(i&(1<<j))
                for(int t=1; t<=k; t++ )
                {
                    if(!(i&(1<<j) ) && dist[j][k] )
                        c[i][j]=min(c[i][j],dist[j][k]+c[i][t]);
                }

    int rez=INF;

    for(int i=1; i<=k; i++)
    {
        if(c[(1<<k) -1 ][i] + dist[i][] )
    }

}


struct point{
    int p,val;

    bool operator <(const point &aux) const
    {
        return val>aux.val;
    }
};

std::priority_queue<point> h;

void dijkstra(int a)
{
    h.push(point{a,0});

    point act;

    while(!h.empty())
    {
        while(!h.empty() &&  dist[a][ h.top().p ]!=0  )
        {
            h.pop();
        }
        if(h.empty())
            return;

        act=h.top();

        dist[act.p][a]=act.val;
        dist[a][act.p]=act.val;
        h.pop();

        for(int i=1; i<=nod; i++)
        {
            if(m[act.p][i]!=0 && dist[a][i]==0 )
            {
                h.push({i,act.val+m[act.p][i]});
            }
        }
    }



}

int main()
{
    fscanf(in,"%d%d",&nod,&muc);

    fscanf(in,"%d",&k);

    for(int i=1; i<=k; i++)
    {
        fscanf(in,"%d",&v[i]);
    }
    v[++k]=1;
    v[++k]=nod;

    int a,b,c;

    for(int i=1; i<=muc; i++)
    {
        fscanf(in,"%d%d%d",&a,&b,&c);

        m[a][b]=c;
        m[b][a]=c;
    }

    for(int i=1; i<=k; i++)
    {
        dijkstra(v[i]);
        dist[v[i]][v[i]]=0;
    }

    partea2();


    return 0;
}