Alex_tz307

1709. Penguin-Avia - Timus

Nov 3rd, 2020 (edited)
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.57 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. int main() {
  6.     ios_base::sync_with_stdio(false);
  7.     cin.tie(nullptr);
  8.     cout.tie(nullptr);
  9.     /* Trebuie sa obtinem in final un graf conex cu numar minim de muchii si sa avem un cost cat
  10.     mai mic al operatiilor din enunt, deci o sa legam toate componentele de componenta unui nod
  11.     (l-am ales pe 0). De asemenea, fiecare componenta o transformam in arborele sau partial de cost
  12.     minim pentru a obtine numar de muchii minim la final.
  13.     */
  14.     int N, D, A;
  15.     cin >> N >> D >> A;
  16.     vector < string > a(N); // matricea initiala pe care o vom si transforma intr-una rezultat
  17.     for(int i = 0; i < N; ++i)
  18.         cin >> a[i];
  19.     vector < bool > viz(N); // daca am ajuns la nodul i sau nu
  20.     long long ans = 0; // rezultatul
  21.     for(int i = 0; i < N; ++i) // Facem Componente Conexe + MST pe fiecare componenta
  22.         if(!viz[i]) { // daca i nu e vizitat vedem de el
  23.             if(i != 0) {
  24.                 a[0][i] = a[i][0] = 'a'; // daca nu e 0 nod il legam de acesta
  25.                 ans += A; // adaugam costul operatiei de legare la rezultat
  26.             }
  27.             queue < int > Q; // pornim cu BFS
  28.             Q.emplace(i); // adaugam i in coada
  29.             viz[i] = true; // marcam i vizitat
  30.             while(!Q.empty()) {
  31.                 int node = Q.front();
  32.                 Q.pop();
  33.                 for(int vec = 0; vec < N; ++vec)
  34.                     if(a[node][vec] == '1') { // daca muchia i -> vec exista
  35.                         if(!viz[vec]) { // daca vecinul nu e vizitat se va afla la final inca in compoenta conexa a lui i
  36.                             a[node][vec] = a[vec][node] = '0';
  37.                             viz[vec] = true; // marcam vec ca vizitat
  38.                             Q.emplace(vec); // adaugam vec in coada, pentru a parcurge in continuare componenta actuala
  39.                         }
  40.                         else { // daca vecinul e deja vizitat nu mai avem nevoie de aceasta muchie
  41.                             a[node][vec] = a[vec][node] = 'd'; // ii dam cancel
  42.                             ans += D; // crestem rezultatul cu costul operatiei de cancel
  43.                         }
  44.                     }
  45.             }
  46.             cout << ans << '\n'; // afisam rezultatele
  47.             for(int i = 0; i < N; ++i , cout << '\n')
  48.                 for(int j = 0; j < N; ++j)
  49.                     cout << a[i][j];
  50.         }
  51.     cout << ans << '\n'; // afisam rezultatele
  52.     for(int i = 0; i < N; ++i , cout << '\n')
  53.         for(int j = 0; j < N; ++j)
  54.             cout << a[i][j];
  55. }
  56.  
Advertisement
Add Comment
Please, Sign In to add comment