Đề bài: TÌM THÀNH PHẦN LIÊN THÔNG Mục Lục 1. Khái niệm 1 1.1 Đồ thị. 1 1.2 Thành phần liên thông. 2 2.Ý tưởng thuật toán: 4 3.Độ phức tạp của thuật toán 7 4.Chương trình minh họa 7 1. Khái niệm 1.1 Đồ thị. • Đồ thị (graph) là một cấu trúc rời rạc gồm các đỉnh và các cạnh nối các đỉnh đó. Được mô tả như sau: G = (V,E). Trong đó: V: tập các đỉnh (vertices). E : tập các cạnh (edges) nối các đỉnh trong V. • Đồ thị vô hướng. G được gọi là đồ thị vô hướng nếu các cạnh trong E là không định hướng, tức là cạnh nối hai đỉnh u, v bất kỳ cũng là cạnh nối hai đỉnh v, u. Hay nói cách khác, tập E gồm các cặp (u, v) không tính thứ tự: (u, v) ≡ (v, u). ...................
Trang 1TRƯỜNG ĐẠI HỌC THƯƠNG MẠI
KHOA HỆ THỐNG THÔNG TIN KINH TẾ
BÀI THẢO LUẬN MÔN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
Đề bài:
TÌM THÀNH PHẦN LIÊN THÔNG
GVHD :
Trang 4Mục Lục
1 Khái niệm 1
1.1 Đồ thị 1
1.2 Thành phần liên thông 2
2.Ý tưởng thuật toán: 4
3.Độ phức tạp của thuật toán 7
4.Chương trình minh họa 7
Trang 51 Khái niệm
1.1 Đồ thị.
Đồ thị (graph) là một cấu trúc rời rạc gồm các đỉnh và các cạnh nối các đỉnh đó Được
mô tả như sau: G = (V,E)
Trong đó: V: tập các đỉnh (vertices)
E : tập các cạnh (edges) nối các đỉnh trong V
Đồ thị vô hướng
G được gọi là đồ thị vô hướng nếu các cạnh trong E là không định hướng, tức là cạnh nối hai đỉnh u, v bất kỳ cũng là cạnh nối hai đỉnh v, u Hay nói cách khác, tập E gồm các cặp (u, v) không tính thứ tự: (u, v) ≡ (v, u)
- Ví dụ: trong đồ thị vô hướng này, ta có:
V= {a,b,c,d}
E= {(a,b),(a,c),(b,d),(b,c)}
Đồ thị có hướng
G được gọi là đồ thị có hướng nếu các cạnh trong E là có định hướng, tức là có thể có cạnh nối từ đỉnh u tới đỉnh v nhưng chưa chắc đã có cạnh nối từ đỉnh v tới đỉnh u Hay nói cách khác, tập E gồm các cặp (u, v) có tính thứ tự: (u, v) ≠ (v, u) Trong đồ thị có hướng, các cạnh được gọi là các cung
Ví dụ: trong đồ thị có hướng này, ta có:
V = {a,b,c,d}
E = {(a,b),(a,c),(b,d),(c,b),(d,d)}
Một số khái niệm liên quan:
- Một cạnh (cung) bắt đầu và kết thúc tại một đỉnh được gọi là khuyên
1
Trang 6- Hai cạnh (hai cung cùng hướng) của cùng một cặp đỉnh được gọi là các cặp cạnh (cung) song song với nhau
- Đồ thị vô hướng G là đơn đồ thị nếu không có các cạnh song song và không có khuyên
Đồ thị vô hướng G là đa đồ thị nếu tồn tại ít nhất một cặp cạnh song song và không có khuyên
- Đồ thị có hướng G là đơn đồ thị nếu không có các cung song song và G được gọi là đa
đồ thị nếu tồn tại ít nhất một cặp cung song song
1.2 Thành phần liên thông.
Đồ thị vô hướng liên thông
- Đồ thị vô hướng G = ( X,U) được gọi là liên thông nếu hai đỉnh phân biệt bất kỳ của đồ thị liên thông với nhau
Đồ thị có hướng liên thông
- Đồ thị có hướng G = ( X,U) được gọi là liên thông mạnh nếu hai đỉnh phân biệt bất kỳ của đồ thị là liên thông
- Đồ thị có hướng G = ( X,U) được gọi là liên thông yếu nếu đồ thị vô hướng nền là liên thông
Thành phần liên thông
Cho G1 = (X1, U1) và G2 = (X2, U2) là hai đồ thị liên thông không chung đỉnh Khi
đó, ta nói đồ thị G= ( X, U), trong đó X= X1 U X2 , U = U1 U U2 có hai thành phần liên thông G1 và G2 được gọi là các thành phần liên thông của G
Các thành phần liên thông của một đồ thị là các đồ thị con liên thông rời nhau.
- Một đồ thị không liên thông sẽ bao gồm nhiều đồ thị con liên thông, các đồ thị con này được gọi là các thành phần liên thông Đồ thị liên thông khi và chỉ khi
có một thành phần liên thông.
Trang 7
- Thành phần liên thông của một đồ thị vô hướng: là một đồ thị con trong đó giữa bất kì
hai đỉnh nào đều có đường đi đến nhau, và không thể nhận thêm bất kì một đỉnh nào mà vẫn duy trì tính chất trên
- Một đồ thị liên thông có đúng một thành phần liên thông, chính là toàn bộ đồ thị
- Ví dụ
+ Đồ thị vô hướng trên có đúng 1 thành phần liên thông
1
2
Trang 82.Ý tưởng thuật toán:
Bước 0: Khởi tạo số thành phần liên thông bằng 0.
Bước 1: Xuất phát từ một đỉnh chưa được đánh dấu của đồ thị Ta đánh dấu đỉnh xuất
phát, tăng số thành phần liên thông lên 1 và chuyển sang bước 2
Bước 2: Từ một đỉnh i đã đánh dấu, ta đánh dấu đỉnh j nếu A[i,j] = 1 và j chưa được đánh
dấu và chuyển sang Bước 3
Bước 3: Thực hiện Bước 2 cho đến khi không còn thực hiện được nữa chuyển sang
Bước 4
Bước 4: Nếu số số đỉnh đánh dấu bằng n kết thúc thuật toán, ngược lại quay về Bước 1.
Mô tả bài toán: Cho đồ thị vô hướng G=(V,E) hãy đếm số thành phần liên thông của đồ thị G
Cho đồ thị G vô hướng (4 đỉnh):
Xét tính liên thông đồ thị G bằng thuật toán DFS:
Trang 9 Bước 1: Gán nhãn các đỉnh là 0
Bước 2:
Với I = 1: gán nhãn đỉnh I = 1 và xét từ đỉnh I có đường đi đến các đỉnh còn lại không
Ta sẽ thấy từ đỉnh 1 có đường đi đến đỉnh 2 nên sẽ gán nhãn 2 là 1
Trang 10
Tại đỉnh 2 ta xem có đường đi từ 2 đến các đỉnh còn lại không, từ đỉnh 2 ta đi được đến đỉnh 3 nên ta sẽ gán nhãn của đỉnh 3 là nhãn của đỉnh 2
Tại đỉnh 3 ta xem có đường đi từ 3 đến các đỉnh còn lại không, từ đỉnh 3 ta đi được đến đỉnh 4 nên ta sẽ gán nhãn của đỉnh 4 là nhãn của đỉnh 3
Trang 11 Từ đỉnh 1 ta đã đi được đến các đỉnh còn lại trong đồ thị nên G
là 1 đồ thị liên thông vì G chỉ có
1 chu trình duy nhất Kết thúc thuật toán
Thành phần liên thông 1: 1 2 3
4
3.Độ phức tạp của thuật toán
Độ phức tạp của thuật toán : TH1: Tốt nhất khi
Đồ thị liên thông (số thành phần liên thông của nó là 1)
Điều này tương đương với phép duyệt theo thủ tục DFS(u) hoặc BFS(u) được gọi đến đúng một lần
Do phuc tap: O(n)
TH2: Xấu nhất khi
Đồ thị không liên thông (số thành phần liên thông lớn hơn 1)
Tách chúng thành những đồ thị con liên thông Điều này cũng có nghĩa là trong phép duyệt đồ thị, số thành phần liên thông của nó bằng đúng số lần gọi tới thủ tục DFS() hoặc BFS()
Ở mỗi bước lặp để tìm ra điểm I , J cần thực hiện O(n) phép toán, để gán nhãn cũng cần thực hiện 1 lượng phép toán là O(n) Thuật toán cần phải thực hiện n-1 bước lặp → độ phức tạp của thuật toán sẽ là n + n(n-1) = O(n2)
Do phuc tap: O(n^2)
4.Chương trình minh họa
#include <stdio.h>
Trang 12
#include <conio.h>
#define MAX 50
#define TRUE 1
#define FALSE 0
int A[MAX][MAX], n,chuaxet[MAX]; void DFS_Dequi(int u) {
int v;
if(chuaxet[u]!=FALSE)
{
printf("%3d",u); chuaxet[u]=FALSE;
for(v=1; v<=n; v++)
{
if(A[u][v] && chuaxet[v]) {
DFS_Dequi(v); }
}
}
}
void nhapbp()
{
Trang 13printf ("nhap ma tran ke");
printf ("\n nhap so dinh:");
scanf ("%d",&n);
for (int i=1;i<=n;i++){
printf("\n");
chuaxet[i]=TRUE;
for (int j=1; j<=n; j++)
{
printf("nhap phan tu %d%d:\n",i,j); scanf ("%d",&A[i][j]);
}
}
printf("\n -");
for(int i=1; i<=n; i++){
printf("\n");
for(int j=1; j<=n; j++){
printf("%3d",A[i][j]); }
} }
void nhapfile(){
int i,j;
FILE *fp;
fp=fopen("E:\\DOTHI.TXT","r");
Trang 14
fscanf(fp,"%d",&n);
printf("\n So dinh do thi:%d",n);
for(i=1; i<=n; i++){
printf("\n");
chuaxet[i]=TRUE;
for(j=1; j<=n; j++){
fscanf(fp,"%d",&A[i][j]);
printf("%3d",A[i][j]);
} }
}
int main()
{
int u, d, ch;
d=0;
while(1)
{
printf("\n -\n1.Nhap tu ban phim\n2.nhap tu file\ n3.tim cac thanh phan lien thong\n4.Exit\n");
printf("\n hay chon mot chuc nang: ");
scanf("%d",&ch);
printf("\n -\n");
switch(ch) {
Trang 15case 1:nhapbp();break;
case 2:nhapfile();break;
case 3:
d=0;
printf("\n cac thanh phan lien thong la:\n");
for ( u=1;u<=n;u++){
if (chuaxet[u]){
d++;
printf("\n thanh phan lien thong thu %d\n",d); DFS_Dequi(u);
} };break;
case 4:return 0;
default:printf("nhap sai vui long nhap lai \n");break;
} }
getch();
return 0;
Chạy trong dev c