Cod sursa(job #890023)

Utilizator mihai27Mihai Popescu mihai27 Data 24 februarie 2013 20:17:32
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include<fstream>
#include<string.h>
#include<vector>
#include<queue>

using namespace std;

ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");

int D[2005];

struct cmp
{
    bool operator() (const int &a, const int &b)
    {
        return (D[a]>D[b]);
    }
};

int t,i,j,nod,nod2,n,m,k,x,y,c,X[20],sol[20][20],B[20][1<<18];
vector<pair<int,int> > a[2005];
priority_queue<int,vector<int>,cmp> Q;
vector<pair<int,int> >::iterator it;

void dijkstra(int nod)
{
    D[nod]=0;
    Q.push(nod);

    while (!Q.empty())
    {
        nod=Q.top();
        for (it=a[nod].begin();it!=a[nod].end();it++)
        {
            nod2=(*it).first;
            if (D[nod] + (*it).second < D[nod2])
            {
                D[nod2]=D[nod]+(*it).second;
                Q.push(nod2);
            }
        }
        Q.pop();
    }
}

int main()
{
    in>>n>>m>>k;

    for (i=1;i<=k;i++)
        in>>X[i];
    X[k+1]=n;
    k+=1;

    for (i=1;i<=m;i++)
    {
        in>>x>>y>>c;
        a[x].push_back(make_pair(y,c));
        a[y].push_back(make_pair(x,c));
    }

    memset(D,0x3f3f3f3f,sizeof(D));
    dijkstra(1);
    for (j=1;j<=k;j++)
        B[j][1<<(j-1)]=D[X[j]];


    for (i=1;i<=k;i++)
    {
        memset(D,0x3f3f3f3f,sizeof(D));
        dijkstra(X[i]);
        for (j=1;j<=k;j++)
            sol[i][j]=D[X[j]];
    }
    B[0][0]=0;
    for (i=1;i<=(1<<k)-1;i++)
        for (j=1;j<=k;j++)
            if ((i & (1<<(j-1))) && (i-(1<<(j-1))))
            {
                B[j][i]=0x3f3f3f3f;
                for (t=1;t<=k;t++)
                    if (i & (1<<(t-1)) && j!=t)
                        B[j][i]=min(B[j][i],B[t][i-(1<<(j-1))] + sol[t][j]);
            }
    out<<B[k][(1<<k)-1];
}