Cod sursa(job #1618203)

Utilizator feli2felicia iuga feli2 Data 27 februarie 2016 18:49:31
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <iostream>
#include <fstream>
#include <queue>
#define f first
#define s second

using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");

struct triple
{
    int dist, node;
    long long stare;
    triple(int d, int n, int st)
    {
        dist=d;
        node=n;
        stare=st;
    }
};

class cmp
{
public :
    bool operator()(triple a, triple b)
    {
        if(a.dist!=b.dist)
            return a.dist>b.dist;
        if(a.node!=b.node)
            return a.node<b.node;
        return 0;
    }
};

priority_queue < triple, vector<triple>,cmp >Q;
vector <pair<int, int> >G[2004];
//const int oo=(1<<18);
bool d[2004][(1<<15)+5];
int K[2004];
int n, k, m, i, c, x, y, z;

int dij()
{
    Q.push(triple(0,1,0));
    while(!Q.empty())
    {
        int node=Q.top().node;
        int dist=Q.top().dist;
        long long stare=Q.top().stare;
        Q.pop();
        if(node==n&&stare==(1<<k)-1)
            return dist;
        if(!d[node][stare])
        {
            d[node][stare]=1;
            for(unsigned int i=0;i<G[node].size();i++)
            {
                if(K[G[node][i].f]>=0&&!(stare&(1<<K[G[node][i].f])))
                {
                    long long stare2=stare+(1<<K[G[node][i].f]);
                    if(!d[G[node][i].f][stare2])
                    {
                        Q.push(triple(dist+G[node][i].s,G[node][i].f,stare2));
                    }
                }
                else
                {
                    if(!d[G[node][i].f][stare])
                    {
                        Q.push(triple(dist+G[node][i].s,G[node][i].f,stare));
                    }
                }
            }
        }
    }
    return -1;
}

int main()
{
    fin>>n>>m;
    fin>>k;
    for(i=0;i<=n;i++)
        K[i]=-1;
    for(i=0;i<k;i++)
    {
        fin>>c;
        K[c]=i;
    }
    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>z;
        G[x].push_back(make_pair(y,z));
        G[y].push_back(make_pair(x,z));
    }
    fout<<dij();
    return 0;
}