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

Depth-first search

#include "fstream"
#include "iostream"

using namespace std;

int Arr[100][100];         // Ma trận kề
int size; // Số đỉng
int visited[100] = {0}; // Tạo mảng đánh dấu các phần tử đã duyệt

// 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 DFS(int v, int dem)   // Deep First Search
{
visited[v] = dem;      // Đánh dấu vị trí đã duyệt

int i = 0;
for (i = 0; i < size; ++i)    // Tiếp tục xét các cạnh kề
{
bool kt = (Arr[v][i] == 1 || Arr[i][v] == 1);  // có cạnh nối hay không
if (kt && visited[i] == 0)    // Nếu có cạnh nối và đỉnh đó chưa thăm
{
DFS(i, dem);  // Xét tiếp cạnh tiếp theo
}
}
}

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++;
DFS(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