Cod sursa(job #2527828)

Utilizator octamarina@gmail.comOctavian Marina [email protected] Data 20 ianuarie 2020 21:43:15
Problema Ubuntzei Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.92 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
vector <int> muchii[10000];//declarare vector muchii
queue  <int> coada;//declarare coada
int mat[2001][2001]={0};//matrice de costuri
int distanta[2001];


void blank(int m)//face -1 vectorul distanta
{
    for(int i=0;i<=m;i++)
        distanta[i]=-1;
}

void bts()
{
    while(!coada.empty())//cat timp mai sunt elemente in coada
    {
        int nod=coada.front();//declara nodul curent
        coada.pop();
        for(unsigned int i=0;i<muchii[nod].size();i++)//verifica vecinii
        {
            int vecin=muchii[nod][i];//declara vecinii
            int distanta_posibila=distanta[nod]+mat[nod][vecin];//distanta posibila este suma dintre distanta pana la nodul actual pana la nodul urmator
            int distanta_categorica=distanta[vecin];
            //->se compara distanta posbila cu distanta categorica
            if(distanta_posibila<distanta_categorica||distanta_categorica==-1)//daca este -1 distanta atunci aplica algoritmul deoarece -1 inseamna ca nu este parcurs
            {
                distanta[vecin]=distanta_posibila;//distanta posibila devine actuala deoarece este mai mica
                coada.push(vecin);//adauga vecinul in coada

            }
        }
    }
}



int main()
{
    ifstream f("ubuntzei.in");//sterge txt-ul
    ofstream g("ubuntzei.out");
    int n,m; f>>n>>m;//citire muchii si laturi
    int k,sir_k[2000];f>>k;
    for(int i=1;i<=k;i++)//citeste sirul de prieteni
    {
        int x;f>>x;
        sir_k[i]=x;
    }
    for(int i=1;i<=m;i++)//citire fisier matrice
    {
        int x,y,z;
        f>>x>>y>>z;
        muchii[x].push_back(y);
        muchii[y].push_back(x);
        mat[x][y]=z;
        mat[y][x]=z;
    }

    blank(m);//face vectorul distanta -1 pentru a putea aplica bts
    coada.push(1);
    distanta[1]=0;
    bts();
    cout<<endl;
    //for(int i=1;i<=n;i++)
        //cout<<distanta[i]<<" ";
    long int rez_final=0;
    long int minim=99999,mini,mini2;//minim este distanta pana la cel mai apropiat prieten si mini numarul de ordine al acestuia iar mini2 pozitia in sirul k a prietenului care a fost luat
    for(int i=1;i<=k;i++)//parcurge de k or sirul de prieteni pana dispar toti prietenii
    {
        for(int j=1;j<=k;j++)//parcurge prietenii
        {
            int prieten=sir_k[j];
            if(distanta[prieten]<minim&&prieten!=-1)
            {
                minim=distanta[prieten];
                mini=prieten;
                mini2=j;
            }
        }
        rez_final=rez_final+minim;
        minim=99999;
        blank(m);
        sir_k[mini2]=-1;
        coada.push(mini);
        distanta[mini]=0;
        bts();
    }
    rez_final=rez_final+distanta[n];
    g<<rez_final;
    //cout<<endl;
    //for(int i=1;i<=m;i++)
        //cout<<distanta[i]<<" ";
    return 0;
}