Cod sursa(job #3163691)

Utilizator PieleVoinescu David Piele Data 31 octombrie 2023 21:33:07
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <vector>
#include <queue>
const int NMAX = 100001;
std::vector<int> G[NMAX];
int viz[NMAX];
int dist[NMAX];
int puncte_control[NMAX];
int n, m;
int nod_start;
std::queue<int> Q;

void citire()
{
    std::cin >> n >> m;
    int x, y;
    for (int i = 1; i <= m; ++i)
    {
        std::cin >> x >> y;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    int punct_control;
    while (std::cin >> punct_control)
    {
        puncte_control[punct_control] = 1;
        Q.push(punct_control);
        viz[punct_control] = 1;
    }
    for (int i = 1; i <= n; ++i)
    {
        dist[i] = NMAX;
    }
}

void bfs()
{
    while (!Q.empty())
    {
        int nod = Q.front();
        Q.pop();
        for (auto x : G[nod])
        {
            dist[x] = std::min(dist[x], dist[nod] + 1);
            if (!viz[x]) 
            {
                viz[x] = 1;
                Q.push(x);
            }
        }
    }
}

void solve()
{
    for (int i = 1; i <= n; ++i)
        if (puncte_control[i])
            dist[i] = 0;

    bfs();

    for (int i = 1; i <= n; ++i)
    {
        std::cout << dist[i] << " ";
    }
}

void testare()
{
    for (int i = 1; i <= n; ++i)
    {
        std::cout << i << ": ";
        for (auto nod : G[i])
        {
            std::cout << nod << " ";
        }
        std::cout << '\n';
    }
    for (int i = 1; i <= n; ++i)
    {
        if (puncte_control[i])
            std::cout << i << " ";
    }
}

int main()
{
    citire();
    //testare();
    solve();
}