Cod sursa(job #1162243)

Utilizator alex_ovidiunituAlex Ovidiu Nitu alex_ovidiunitu Data 31 martie 2014 18:42:15
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <queue>
#include <vector>
#define OO 200000000
using namespace std;
int c[20],n,m,k,d[20][2014],a[2014],dist1[20][33000];
vector < pair <int, int> > v[2014];
void dj (int nod, int w[])
{
    int i,nod1,nodc,cost;
    queue <int> q;
    q.push(nod);
    while (!q.empty())
    {
        nod1=q.front();
        q.pop();
        for (i=0;i<v[nod1].size();i++)
        {
            nodc=v[nod1][i].first;
            cost=v[nod1][i].second;
            if (w[nodc]==0 || (w[nodc]>w[nod1]+cost))
            {
                w[nodc]=w[nod1]+cost;
                q.push(nodc);
            }
        }
    }
}
int main()
{
    int i,j,x,y,z;
    fstream f,g;
    f.open("ubuntzei.in",ios::in);
    g.open("ubuntzei.out",ios::out);
    f>>n>>m>>k;
    for (i=0;i<k;i++)
        f>>c[i];
    for (i=1;i<=m;i++)
    {
        f>>x>>y>>z;
        v[x].push_back(make_pair(y,z));
        v[y].push_back(make_pair(x,z));
    }
    dj(1,a);
    for (i=0;i<k;i++)
        dj(c[i],d[i]);
    int nrsub=1<<k;
    if (k==0)
    {
        g<<a[n]<<"\n";
        return 0;
    }
    int s;
    for (s=1;s<nrsub;s++)
    {
        for (i=0;i<k;i++)
            if (s==1<<i)
            {
                dist1[i][s]=a[c[i]];
                break;
            }
        if (i<k) continue ;
        for (i=0;i<k;i++)
        {
            dist1[i][s]=OO;
            if (s&(1<<i))
                for (j=0;j<k;j++)
                    if (s&(1<<j) && i!=j)
                        dist1[i][s]=min(dist1[i][s],dist1[j][s-(1<<i)]+d[j][c[i]]);
        }
    }
    int MIN=OO;
    for (i=0;i<k;i++)
        MIN=min(MIN, dist1[i][nrsub-1]+d[i][n]);
    g<<MIN;
}