Cod sursa(job #2522784)

Utilizator AltexStefanButacu Stefan AltexStefan Data 12 ianuarie 2020 23:27:35
Problema Ubuntzei Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <bits/stdc++.h>
#define NMAX 2005
#define inf 1 << 30 -1
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int G[NMAX][NMAX];
int K,M,N;
vector <int>  Oras_Pr;
void citire()
{

    f>> N >> M;
    f >> K;
    for(int i =1 ; i <= K ;i++)
        {
            int pr;
            f >> pr;
            Oras_Pr.push_back(pr);
        }
    for(int i = 1; i <= N;i++)
        for(int j = 1 ; j <= N ; j++)
           if(i != j ) G[i][j] = inf;
           else G[i][j] = 0;

    for(int i = 1; i <= M ; i++)
    {
        int x,y,cost;
        f >> x >> y >> cost;
        G[x][y]= cost;
        G[y][x]= cost;
    }

}
void Roy_Floyd()
{
    int k,i,j;
    for(k = 1 ; k <= N ; k++)
    {
        for(i = 1 ; i <= N ; i++)
            for(j = 1 ; j <= N ;j++)
                if(G[i][j] > G[i][k] + G[k][j])
                    G[i][j] = G[i][k] + G[k][j];
    }
}
bool E_Prieten(int nod)
{
    for(int i = 0 ; i < Oras_Pr.size(); i++)
        if(nod == Oras_Pr[i])
        {
            Oras_Pr.erase(Oras_Pr.begin()+i);
            return true;
        }
    return false;
}
int Determina_prieten(int linie, int &cost, int &next)
{
    int dist_min = inf;
    int Next_prieten;
    for(int i = 1; i <= N ; i++)
    {
        if(G[linie][i] < dist_min && E_Prieten(i))
        {
            dist_min = G[linie][i];
            Next_prieten = i;
        }
    }
    cost = dist_min;
    next = Next_prieten;
    /// nu mai sunt prieteni de vizitati
    if( dist_min == inf)
        return 0;
    return 1;
}
int cost_final;
void Parcurgere(int start)
{
    /// vezi costul cel mai mic al prietenului
    /// de pe linia start
    int cost = 0 ;
    int next = 0;
    if( Determina_prieten(start,cost,next) == 1)
    {
        cost_final += cost;
        Parcurgere(next);
    }
    else
        {
            cost_final += G[start][N];
        }
}
int main()
{
    citire();
    Roy_Floyd();
    Parcurgere(1);
    g<< cost_final;
    return 0;
}