Cod sursa(job #2061463)

Utilizator AndreidgDragomir Andrei Valentin Andreidg Data 9 noiembrie 2017 12:16:33
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.81 kb
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
const int N = 2005;
const int INF = 999999999;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
struct poz{
    int p,d;
};
int n,m,k;
int mat[N];
bool prieteni[N];
int dist[N];
bool ales[N];
queue  <int>    q;
vector <poz> V[N];
void parc()
{
    q.push(1);
    dist[1] = 0;
    while(!q.empty())
    {
        int num = q.front();
        q.pop();
        ales[num] = 0;
        for(int i = 0; i< V[num].size(); i++)
        {
            int ds = dist[num] + V[num][i].d;
            int nx = V[num][i].p;
            //g<<num<<" "<<nx<<" | "<<ds<<" "<<prieteni[nx]+mat[num]<<"\n";
            if(prieteni[nx]==0)
            {
                if(mat[nx]<mat[num])
                {
                    dist[nx] = ds;
                    mat[nx]  = mat[num];
                    if(ales[nx]==0)
                    {
                        ales[nx]=1;
                        q.push(nx);
                    }
                }
                else if(mat[nx]==mat[num] && ds < dist[nx])
                {
                    dist[nx] = ds;
                    if(ales[nx]==0)
                    {
                        ales[nx]=1;
                        q.push(nx);
                    }
                }
            }
            else
            {
                if(mat[nx]<mat[num])
                {
                    dist[nx] = ds;
                    mat[nx]  = mat[num] + prieteni[nx];
                    if(ales[nx]==0)
                    {
                        ales[nx]=1;
                        q.push(nx);
                    }
                }
                else if(mat[nx] == mat[num] + prieteni[nx] && ds <dist[nx])
                {
                    dist[nx] = ds;
                    if(ales[nx]==0)
                    {
                        ales[nx]=1;
                        q.push(nx);
                    }
                }
                else if(mat[nx] < mat[num] + prieteni[nx] && ds <dist[nx])
                {
                    dist[nx] = ds;
                    mat[nx]  = mat[num] + prieteni[nx];
                    if(ales[nx]==0)
                    {
                        ales[nx]=1;
                        q.push(nx);
                    }
                }
            }
        }
    }
}
int main()
{
    f>>n>>m;
    for(int i = 1; i<= n; i++)
    {
        dist[i] = INF;
    }

    f>>k;
    for(int i = 1; i<= k; i++)
    {
        int x;
        f>>x;
        prieteni[x] = 1;
    }
    for(int i = 1; i<= m; i++)
    {
        int x,y,ds;
        f>>x>>y>>ds;
        V[x].push_back({y,ds});
        V[y].push_back({x,ds});
    }
    parc();
    g<<dist[n];
    f.close();
    g.close();
    return 0;
}