#include <fstream>
#include <iostream>
#include <queue>
using namespace std;
queue<int> Queue; // Tạo hàng đợi
int Arr[100][100]; // Ma trận kề
int size; // Số đỉnh
int visited[100] = {0}; // Mảng kiếm tra đã xét hết các phần tử hay chưa
// Nhập file từ ma trận kề
void Import(char *filename)
{
ifstream txt (filename);
txt >> size;
if (txt.is_open())
{
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
txt >> Arr[i][j];
}
}
txt.close();
}
else cout << "Unable to open file";
}
// Xuất file từ ma trận kề
void Export()
{
ofstream txt ("Output.txt");
if (txt.is_open())
{
txt << size << "\n";
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
txt << Arr[i][j];
if(j != size-1)
txt << " ";
}
if (i != size-1)
txt << "\n";
}
txt.close();
}
else cout << "Unable to open file";
}
void BFS(int v, int dem) // Breadth First Search
{
Queue.push(v); // Đưa đỉnh v vào trong hàng đợi
while (!Queue.empty())
{
int p = Queue.front(); // Lấy q ra khỏi hàng đợi
Queue.pop();
visited[p] = dem;
for (int i = 0; i < size; ++i) // Duyệt các đỉnh kề với p
{
bool ck = (Arr[i][p] == 1) || (Arr[p][i] == 1); // Nếu tồn tại cạnh nối
if (ck && visited[i] == 0)
{
Queue.push(i); // Đẩy đỉnh i vào hàng đợi
}
}
}
}
int xetLienThong()
{
int dem = 0; // biến để đếm xem có bao nhiêu thành phần liên thông
for (int i = 0; i < size; i++) // Xét mảng visited
{
if (visited[i] == 0) // Nếu duyệt đến phần tử nào
{
dem++;
BFS(i, dem); // thì duyệt theo hướng đó
}
}
return dem;
}
void InThanhPhanLienThong()
{
int soTPLT = xetLienThong();
if(soTPLT == 1)
printf("Do thi lien thong.\n");
else
{
printf("Do thi khong lien thong, co %d TPLT.\n", soTPLT);
for(int i = 1; i <= soTPLT; ++i)
{
printf("Mien lien thong %d:", i);
for(int j = 0; j < size; ++j)
{
if(visited[j] == i)
printf(" %d", j);
}
printf("\n");
}
}
}
void main()
{
Import("Matrix.txt");
Export();
InThanhPhanLienThong();
}
Không có nhận xét nào:
Đăng nhận xét