fbpx

Problema #544 – Partial – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Se dă un graf neorientat conex cu n vârfuri și număr par de muchii. Să se determine un graf parțial al celui dat care să fie conex și să fie obținut prin eliminarea a jumătate din numărul de muchii.

Date de intrare

Fișierul de intrare partial.in conține pe prima linie numărul n, iar pe a următoarele linii perechi de numere i j, cu semnificația că există muchie de la i la j.

Date de ieșire

Fișierul de ieșire partial.out va conține matricea de adiacență a grafului parțial obținut, câte o linie a matricei pe o linie a fișierului, elementele fiecărei linii fiind separate prin exact un spațiu.

Restricții și precizări

  • 1 ≤ n ≤ 200
  • 1 ≤ i,j ≤ n
  • se garantează existența unui graf parțial cu proprietatea cerută

Exemplu

partial.in

6
1 2
1 3
1 4
1 5
1 6
2 4
2 5
3 4
3 5
4 5
4 6
5 6

partial.out

0 1 0 0 0 0 
1 0 0 1 0 0 
0 0 0 1 1 0 
0 1 1 0 0 1 
0 0 1 0 0 1 
0 0 0 1 1 0 

Observații

  • 2016, iunie 02: am adăugat un test cu o situație care nu era cuprinsă în testele anterioare.
#include <bits/stdc++.h>

using namespace std;

ifstream cin ("partial.in");
ofstream cout("partial.out");

int n , m , x , y , a[202][202], v[202], T[202];

void dfs(int nod , int t)
{
    T[nod] = t;
    v[nod] = 1;
    for(int i = 1 ; i <= n ; ++i)
        if(a[nod][i] == 1 && !v[i])
                dfs(i , nod);
}

int main()
{
    cin >> n;
    while(cin >> x >> y) a[x][y] = a[y][x] = 1 , m++;
    
    dfs(1 , 0);
    for(int i = 1 ; i <= n ; ++i)
        if(T[i] != 0) a[i][T[i]] = a[T[i]][i] = -1;///pun muchiile necesare ca sa ramana conex
        
    int diferenta = m;
    for(int i = 1 ; i < n ; ++i)
        for(int j = i + 1 ; j <= n ; ++j)
            if(a[i][j] == 1)
                if(diferenta > m / 2) a[i][j] = a[j][i] = 0 , diferenta--;///scot muchiile in plus

    for(int i = 1 ; i <= n ; ++i)
        for(int j = 1 ; j <= n ; ++j)
            if(a[i][j] == -1) a[i][j] = 1;

    for(int i = 1 ; i <= n ; ++i)
    {
        for(int j = 1 ; j <= n ; ++j)
            cout << a[i][j] << " ";
        cout << '\n';
    }
    return 0;
}
Comentarii

S-ar putea sa iti placa