Cod sursa(job #1899548)

Utilizator MithrilBratu Andrei Mithril Data 2 martie 2017 20:04:14
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <bits/stdc++.h>
using namespace std;

typedef pair<int,int> wow;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");

const int NMAX=375;
const int KMAX=((1<<15)-1)+5;

int n,m,k;
int cost[NMAX][KMAX];
bitset<NMAX> stops;
vector <pair <int,int> > graf[NMAX]; /// nod , cost
priority_queue<pair <int,wow>, vector <pair<int, wow> >, greater < pair <int, wow> > > q;   /// cost , nod , stare

void dijkstra()
{
    int i,nodActual,confActual,costActual,vecini,nodNou,costNou,copieConf;
    cost[1][0]=0;
    q.push(make_pair(0,make_pair(1,0)));

    while(!q.empty())
    {
        costActual=q.top().first;
        nodActual=q.top().second.first;
        confActual=q.top().second.second;
        copieConf=confActual;

        q.pop();

        for(auto w:graf[nodActual])
        {
            confActual=copieConf;
            nodNou=w.first;
            costNou=w.second;

            if (costActual>cost[nodActual][confActual]) continue;

            if (stops[nodNou]!=0) {
                confActual=( (confActual) | (1<<(stops[nodNou]-1)) );
            }

            if (costNou+costActual<cost[nodNou][confActual])
            {
                cost[nodNou][confActual]=costNou+costActual;
                q.push(make_pair(costNou+costActual,make_pair(nodNou,confActual)));
            }
        }
    }
}

int main()
{

    int i,j,x,y,costActual,nrfriends=0;

    fin>>n>>m>>k;

    for (i=1; i<=n; i++) for (j=1; j<=KMAX; j++) cost[i][j]=INT_MAX;

    for (i=1; i<=k; i++)
    {
        fin>>x;
        stops[x]=1;
    }

    for (i=1; i<=m; i++)
    {
        fin>>x>>y>>costActual;
        graf[x].push_back(make_pair(y,costActual));
        graf[y].push_back(make_pair(x,costActual));
    }

    dijkstra();
    fout<<cost[n][(1<<k)-1];

    return 0;
}