Pagini recente » Cod sursa (job #1287263) | Cod sursa (job #1208858) | Cod sursa (job #1021771) | Cod sursa (job #2140203) | Cod sursa (job #3251004)
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
#include <algorithm>
using namespace std;
// Funcția pentru construirea listei de adiacență
void construiesteLista(const string& numeFisier, vector<vector<int>>& lista, int& n) {
ifstream f(numeFisier);
if (!f) {
cout << "Eroare la deschiderea fișierului!" << endl;
return;
}
int m; // Numărul de muchii
f >> n >> m; // Citim numărul de noduri și muchii
lista.resize(n + 1); // Redimensionăm lista pentru n noduri (indexate de la 1)
int a, b;
for (int i = 0; i < m; ++i) {
f >> a >> b;
lista[a].push_back(b); // Adăugăm b la lista de adiacență a nodului a
lista[b].push_back(a); // Adăugăm a la lista de adiacență a nodului b (graful este neorientat)
}
f.close();
}
// Funcția pentru afișarea listei de adiacență
void afisareLista(const vector<vector<int>>& lista, int n) {
for (int i = 1; i <= n; ++i) {
cout << "Nodul " << i << " este adiacent cu: ";
for (int j = 0; j < lista[i].size(); ++j) {
cout << lista[i][j] << " "; // Afișăm fiecare vecin al nodului i
}
cout << endl;
}
}
// Funcție pentru parcurgerea în lățime (BFS)
void bfs(int s, const vector<vector<int>>& graf, vector<int>& parinte) {
int n = graf.size();
vector<bool> vizitat(n, false);
queue<int> q;
q.push(s);
vizitat[s] = true;
parinte[s] = -1;
while (!q.empty()) {
int nod = q.front();
q.pop();
for (int i : graf[nod]) { // Iterăm prin vecinii nodului curent
if (!vizitat[i]) {
q.push(i);
vizitat[i] = true;
parinte[i] = nod;
}
}
}
}
// Funcție pentru a afișa drumul minim de la nodul de start s la nodul x
void afiseazaDrum(int x, const vector<int>& parinte) {
vector<int> drum;
for (int i = x; i != -1; i = parinte[i]) {
drum.push_back(i);
}
reverse(drum.begin(), drum.end());
cout << "Drumul minim de la s la x este: ";
for (int nod : drum) {
cout << nod + 1 << " "; // Afișăm nodurile din drum (indexate de la 1)
}
cout << endl;
}
// Funcția pentru construirea matricei de adiacență
void construiesteMatriceAdiacenta(const string& numeFisier, vector<vector<int>>& matrice, bool orientat) {
ifstream f(numeFisier);
if (!f) {
cout << "Eroare la deschiderea fișierului!" << endl;
return;
}
int n, m;
f >> n >> m;
matrice.resize(n, vector<int>(n, 0));
for (int i = 0; i < m; ++i) {
int u, v;
f >> u >> v;
u--; v--; // Ajustăm indexarea
matrice[u][v] = 1;
if (!orientat) {
matrice[v][u] = 1;
}
}
f.close();
}
// Funcția pentru afișarea matricei de adiacență
void afiseazaMatriceAdiacenta(const vector<vector<int>>& matrice) {
cout << "Matricea de adiacență este:" << endl;
for (const auto& rand : matrice) {
for (int elem : rand) {
cout << elem << " ";
}
cout << endl;
}
}
int main() {
vector<vector<int>> matriceAdiacenta; // Declaram matricea de adiacență
bool orientat;
cout << "Introduceti 1 pentru graf orientat sau 0 pentru graf neorientat: ";
cin >> orientat;
// Construim matricea de adiacență din fișierul "input.in"
construiesteMatriceAdiacenta("input.in", matriceAdiacenta, orientat);
// Afișăm matricea de adiacență
afiseazaMatriceAdiacenta(matriceAdiacenta);
int s, x;
cout << "Introduceti nodul de start s si nodul destinatie x (indexare de la 1): ";
cin >> s >> x;
s--; x--;
int n = matriceAdiacenta.size();
vector<int> parinte(n, -1);
// Apelăm BFS pentru a găsi drumul de la s
bfs(s, matriceAdiacenta, parinte);
if (parinte[x] != -1) {
afiseazaDrum(x, parinte);
} else {
cout << "Nu exista drum de la " << s + 1 << " la " << x + 1 << endl;
}
vector<vector<int>> lista; // Lista de adiacență
int nrNoduri;
// Construim lista de adiacență din fișierul "lista.in"
construiesteLista("lista.in", lista, nrNoduri);
// Afișăm lista de adiacență
afisareLista(lista, nrNoduri);
return 0;
}