Cod sursa(job #1770070)

Utilizator Bodo171Bogdan Pop Bodo171 Data 3 octombrie 2016 18:47:18
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <iostream>
#include<fstream>
#include<queue>
#include<vector>
using namespace std;
struct nodeDist
{
    int node,d;
}el;
struct CMP
{
    bool operator()(nodeDist unu,nodeDist doi)
    {
        return unu.d>doi.d;
    }
};
priority_queue<nodeDist,vector<nodeDist>,CMP> q;
const int nmax=2005;
vector< pair<int,int> > v[nmax];
int cost[nmax],x,y,z,i,n,m,j,k,ind,start,dist,l[20],cnt,fix;
long long c[20][20],distN[20],best[(1<<15)+5][20],mn;
void dijkstra(int x)
{
    for(i=1;i<=n;i++)
    {
        cost[i]=(1<<30);
    }
    cost[x]=0;
    el.node=x;el.d=0;
    q.push(el);
    while(!q.empty())
    {
        start=q.top().node;
        dist=q.top().d;
        q.pop();
        for(i=0;i<v[start].size();i++)
        {
            el.node=v[start][i].first;
            el.d=v[start][i].second+dist;
            if(el.d<cost[el.node])
            {
                cost[el.node]=el.d;
                q.push(el);
            }
        }
    }
}
int main()
{
    ifstream f("ubuntzei.in");
    ofstream g("ubuntzei.out");
    f>>n>>m;
    f>>k;
    for(i=1;i<=k;i++)
        f>>l[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));
    }
    dijkstra(1);
    if(k==0) {g<<cost[n];return 0;}
    for(i=0;i<k;i++)
    {
        best[(1<<i)][i]=cost[l[i+1]];
    }
    for(cnt=1;cnt<=k;cnt++)
    {
        dijkstra(l[cnt]);
        for(i=0;i<k;i++)
        {
            c[cnt-1][i]=cost[l[i+1]];
        }
        distN[cnt-1]=cost[n];
    }
    fix=(1<<k);mn=(1<<30);
    for(i=1;i<fix;i++)
        for(j=0;j<k;j++)
            if(i&(1<<j))
        {
            for(ind=0;ind<k;ind++)
            {
                if((i&(1<<ind))==0)
                {
                    if(best[i+(1<<ind)][ind]==0||best[i][j]+c[j][ind]<best[i+(1<<ind)][ind])
                    {
                        best[i+(1<<ind)][ind]=best[i][j]+c[j][ind];
                    }
                }
            }
        }
        for(i=0;i<k;i++)
        {
            if(best[fix-1][i]+distN[i]<mn)
                mn=best[fix-1][i]+distN[i];
        }
        g<<mn;
    return 0;
}