Cod sursa(job #1118314)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 24 februarie 2014 10:01:22
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
#define maxn 2005
#define inf 2000000001
vector <vector <int> > ma;
vector <pair <int,int> > muchii[maxn];
vector <int> o;
int n,m,k,ax,i,a,b,c,i1,mask;
vector <int> dijk(int start)
{
    int i,now,dnow,to,dnowto;
    i=now=dnow=to=dnowto=0;
    set <pair <int,int> > myset;
    vector <int> dist (n+1,inf);
    pair <int,int> pr;


    dist[start]=0;

    myset.insert(make_pair(0,start));

    while (!myset.empty())
    {
        now=(*myset.begin()).second;
        dnow=(*myset.begin()).first;
        for (i=0;i<int(muchii[now].size());i++)
        {
            to=muchii[now][i].first;
            dnowto=muchii[now][i].second;
            if (dnow+dnowto<dist[to])
            {
                pr.first=dist[to];
                pr.second=to;
                if (myset.find(pr)!=myset.end())
                    myset.erase(myset.find(pr));
                pr.first=dnow+dnowto;
                pr.second=to;
                dist[to]=dnow+dnowto;
                myset.insert(pr);
            }
        }
        myset.erase(myset.begin());
    }
    vector <int> r;

    for (i=0;i<o.size();i++)
        r.push_back(dist[o[i]]);

    return r;
}

int memo[(1<<20)][20];
int go(int mask,int now)
{
    if (mask==( ( 1<<o.size() ) -1))
    {
        if (now==o.size()-1)
            return 0;
        else
            return inf;
    }

    if (memo[mask][now]!=0)
        return memo[mask][now];

    int i;
    int mn=inf;

    for (i=0;i<o.size();i++)
        if (((1<<i)&mask)==0)
            mn=min(mn,go(mask+(1<<i),i)+ma[now][i]);

    memo[mask][now]=mn;
    return mn;
}

int main(void)
{
    FILE * f;
    f=fopen("ubuntzei.in","r");
    ofstream g("ubuntzei.out");

    fscanf(f,"%d%d",&n,&m);
    fscanf(f,"%d",&k);

    o.push_back(1);
    for (i=0;i<k;i++)
    {
        fscanf(f,"%d",&ax);
        o.push_back(ax);
    }
    o.push_back(n);
    sort(o.begin(),o.end());

    for (i=0;i<m;i++)
    {
        fscanf(f,"%d%d%d",&a,&b,&c);
        muchii[a].push_back(make_pair(b,c));
        muchii[b].push_back(make_pair(a,c));
    }

    for (i=0;i<o.size();i++)
        ma.push_back(dijk(o[i]));

    //for (i=0;i<o.size();i++)
    //{
    //    for (i1=0;i1<o.size();i1++)
    //        cout<<ma[i][i1]<<' ';
    //    cout<<'\n';
    //}

    g<<go(1,0);

    g.close();

    return 0;
}