Cod sursa(job #1582900)

Utilizator zertixMaradin Octavian zertix Data 28 ianuarie 2016 16:47:25
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#define inf 0x3f3f3f3f
using namespace std;

vector<pair  <int , int > > graf[2005];

priority_queue < pair < pair < int ,int > , int >  >  q;


int n,m,k,kuri[2005],dp[2005][65550];

void citire()
{
    scanf("%d%d",&n,&m);
    scanf("%d",&k);
    for (int i=1; i<=k; ++i)
    {
        int x;
        scanf("%d",&x);
        kuri[x]=i;
    }
    for (int i=1; i<=m; ++i)
    {
        int x,y,c;
        scanf("%d%d%d",&x,&y,&c);
        graf[x].push_back(make_pair(y,c));
    }
}

void dijkstra()
{
    q.push(make_pair(make_pair(0,1),0));
    memset(dp,inf,sizeof(dp));
    while (!q.empty())
    {
        int nod=q.top().first.second;
        int c=-q.top().first.first;
        int ors=q.top().second;
        q.pop();

        for (vector <pair <int ,int > > :: iterator it=graf[nod].begin(); it!=graf[nod].end(); ++it)
        {
            if (kuri[it->first] && (ors & 1<<kuri[it->first]))

            {
                if (dp[it->first][ors] > c+it->second)
                {
                    dp[it->first][ors]=c+it->second;
                    q.push(make_pair(make_pair(-(c+it->second),it->first),ors));
                }
            }
            else if (kuri[it->first] && !(ors & 1<<kuri[it->first]))
            {
                if (dp[it->first][ors+1<<kuri[it->first]] > c+it->second)
                {
                    dp[it->first][ors+1<<kuri[it->first]]=c+it->second;
                    q.push(make_pair(make_pair(-(c+it->second),it->first),ors+1<<kuri[it->first]));
                }
            }
            else if (!kuri[it->first] && dp[it->first][ors] > c+it->second)
            {
                dp[it->first][ors]=c+it->second;
                q.push(make_pair(make_pair(-(c+it->second),it->first),ors));
            }
        }

    }
}

int main()
{
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);
    citire();
    dijkstra();
    printf("%d",dp[n][1<<k]);
    return 0;
}