Cod sursa(job #1208511)

Utilizator marcelPFake name marcelP Data 15 iulie 2014 22:46:46
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.56 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;
    for(mask=1;mask<(1<<k);mask++)
    {
        for(i=1;i<=k;i++)
        {
            if(mask&(1<<(i-1)))
            {
                if(mask==(1<<(i-1)))
                {
                    b[i][mask]=d[0][i];
                }
                else
                    for(j=1;j<=k;j++)
                    {
                        if(mask&(1<<(j-1)) && i!=j)
                        {
                            //j, mask&(~(1<<(i-1))) -> i, mask
                            b[i][mask]=min(b[i][mask],b[j][mask&(~(1<<(i-1)))] + d[j][i]);
                        }
                    }
            }
        }
    }
    x=INF;
    if(k==0)
        x=d[0][k+1];
    for(i=1;i<=k;i++)
    {
        x=min(x, b[i][(1<<k)-1]+d[i][k+1]);
    }
    fout<<x;
}