Cod sursa(job #2425253)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 24 mai 2019 17:27:25
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <bits/stdc++.h>
#define Dim 2007
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int N,M,K,Which[Dim],dp[Dim][Dim],a,b,c;
int cont,ans=INT_MAX;
bool viz_for[Dim],viz[Dim][Dim];
typedef pair<int,int> pi;

struct OS
{
    int vertex,care,num;
};

vector <pi> V[Dim];

struct cmp
{
    bool operator()(OS X,OS Y)
    {
        if(dp[X.vertex][X.care]>dp[Y.vertex][Y.care]) return 1;
        else return 0;
    }
};

priority_queue < OS,vector<OS>,cmp > minheap;

void Dijkstra()
{
    for(int i=1;i<=N;i++)
    for(int j=1;j<=N;j++) dp[i][j]=INT_MAX;

    minheap.push({1,1,0});
    viz[1][1]=1;
    dp[1][1]=0;
    while(!minheap.empty())
    {
        OS nod=minheap.top();
        minheap.pop();
        viz[nod.vertex][nod.care]=0;

        if(viz_for[nod.vertex]==1&&dp[nod.vertex][nod.care]<=dp[nod.vertex][nod.care])
        {
            dp[nod.vertex][nod.vertex]=dp[nod.vertex][nod.care];
            nod.care=nod.vertex;
            viz[nod.vertex][nod.care]=0;
            nod.num++;

        }

        //if(nod.num==K&&nod.vertex==N)

        for(unsigned int i=0;i<V[nod.vertex].size();i++)
        {
            int vecin=V[nod.vertex][i].first;
            int cost=V[nod.vertex][i].second;
            if(dp[nod.vertex][nod.care]+cost<dp[vecin][nod.care])
            {
                dp[vecin][nod.care]=dp[nod.vertex][nod.care]+cost;
                if(!viz[vecin][nod.care])
                {
                    viz[vecin][nod.care]=1;
                    minheap.push({vecin,nod.care,nod.num});
                }
            }
        }

    }
}

int main()
{
    f>>N>>M>>K;
    for(int i=1;i<=K;i++)
    {
        f>>a;
        viz_for[a]=1;
        Which[i]=a;
    }
    for(int i=1;i<=M;i++)
    {
        f>>a>>b>>c;
        V[a].push_back({b,c});
        V[b].push_back({a,c});
    }
    Dijkstra();
    for(int i=1;i<=K;i++) ans=min(ans,dp[N][Which[i]]);

    g<<ans;
    return 0;
}