Cod sursa(job #1208462)

Utilizator marcelPFake name marcelP Data 15 iulie 2014 20:13:45
Problema Ubuntzei Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
#define MAXN 2003
#define MAXK 17
#define mp make_pair
#define pb push_back
#define INF 1<<30
typedef vector <pair<int, int> > :: iterator iter;
vector<pair<int, int> > G[MAXN], S[MAXK];
priority_queue <pair<int, int> > H;
priority_queue <pair<int, pair<int, int> > > Q;

int n, dist[MAXN], viz[MAXN], k, d[MAXK][MAXK], a[MAXK], b[MAXK][1<<MAXK], viz2[MAXK][1<<MAXK];

void Djakistra(int index, int nod)
{
    int i;
    for(i=1;i<=n;i++)
    {
        dist[i]=INF;
        viz[i]=0;
    }
    dist[nod]=0;
    H.push(mp(0, nod));
    while(H.size())
    {
        nod=H.top().second;
        H.pop();
        if(viz[nod])
            continue;
        viz[nod]=1;
        for(iter it=G[nod].begin();it!=G[nod].end();it++)
        {
            if(dist[it->first]>dist[nod]+it->second)
            {
                dist[it->first]=dist[nod]+it->second;
                H.push(mp(-dist[it->first], it->first));
            }
        }
    }
    for(i=0;i<=k+1;i++)
    {
        d[index][i]=dist[a[i]];
    }
}

int main()
{

    int i, m, x, y, c, j, mask;
    fin>>n>>m;
    fin>>k;
    for(i=1;i<=k;i++)
        fin>>a[i];

    while(m--)
    {
        fin>>x>>y>>c;
        G[x].pb(mp(y, c));
        G[y].pb(mp(x, c));
    }
    a[0]=1;
    a[k+1]=n;
    for(i=0;i<=k+1;i++)
    {
        Djakistra(i, a[i]);
    }
    /*for(i=0;i<=k+1;i++)
    {
        for(j=0;j<=k+1;j++)
        {
            cout<<d[i][j]<<" ";
        }
        cout<<"\n";
    }*/
    for(i=0;i<=k+1;i++)
    {
        for(j=0;j<(1<<k);j++)
        {
            b[i][j]=INF;
        }
    }
    b[0][0]=0;
    Q.push(mp(0, mp(0, 0)));
    while(Q.size())
    {
        pair<int, int> aux=Q.top().second;
        x=aux.first;
        y=aux.second;
        Q.pop();
        if(viz2[x][y])
            continue;
        viz2[x][y]=1;
        for(i=1;i<=k+1;i++)
        {
            if(i==k+1)
                mask=y;
            else
                mask=y|(1<<(i-1));
            if(b[i][mask]>b[x][y]+d[x][i])
            {
                b[i][mask]=b[x][y]+d[x][i];
                Q.push(mp(-b[i][mask], mp(i, mask)));
            }
        }
    }
    fout<<b[k+1][(1<<k)-1];

}