351
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 ≤ 2001 ≤ 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