Thứ Sáu, 15 tháng 11, 2013

Breadth-first search

#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