1 Lựa chọn cấu trúc dữ ệu li sách kề cung cấp khả năng truy cập nhanh chóng và hiệu quả vào các đỉnh kề của mt đỉnh cho trước.. chứa mt danh sách liên kết các đỉnh kề của đỉnh đó.. Mỗi
Trang 1ĐẠI HỌC BÁCH KHOA HÀ NỘI TRƯỜNG CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
******************************************
THỊ Giảng viên hướng dẫn: TS Trịnh Anh Phúc
Sinh viên thực hiện: Bùi Hoàng Hiệp
MSSV: 20194556 Lớp : Information Technology Specialist 05-K64
Trang 2
Ni dung
Vấn đ ề 3
1 Lựa chọ ấu trúc dữ n c liệu 4
2 Cài đặt giải thuật (mã giả) 5
3 Kết quả ực nghiệmth 10
4 Kết luận 13
Trang 3
Vấn đề
Nhiệm vụ :
G=(V,E)
Chi tiết :
- Sinh viên lập trình đọ ệp tin văn bả ừ thư việc t n t n đ thồ ị SNAP
http://snap.stanford.edu/data/index.html với các đồ ị lớth p lớn
2 Duyệt đồ thị theo chiều sâu (DFS)
3 Đếm số thành phần liên thông (# of connected components) cùng các thông
số đi kèm:
https://en.wikipedia.org/wiki/Component_(graph_theory)
Trang 4
1 Lựa chọn cấu trúc dữ ệu li
sách kề cung cấp khả năng truy cập nhanh chóng và hiệu quả vào các đỉnh kề của mt đỉnh cho trước
chứa mt danh sách liên kết các đỉnh kề của đỉnh đó Mỗi danh sách liên kết được biểu diễn bằng mt chuỗi các nút (node) liên kết với nhau Mỗi nút trong danh
sách
cho các đỉnh và cạnh trong đồ ị th thực sự tồ ại Với đồ ị có số đỉn t th nh l n ớ
trận kề
• Linh hoạt và tiện ích: Danh sách kề cho phép thêm hoặc xóa các đỉnh và
dữ ệu Nó cũng dễ dàng để ực hiện các thao tác như kiểm tra sự tồli th n tại của mt cạnh hay tìm kiếm các đỉnh kề của mt đỉnh cho trước
• Truy cập nhanh chóng: Với danh sách kề, ta có thể truy cập nhanh chóng
qua danh sách liên kết của đỉnh đó
Trang 5Tuy nhiên, cũng cần lưu ý rằng danh sách kề có thời gian truy xuất tỷ lệ tuyến tính với số đỉnh kề của mt đỉnh Do đó, nếu ta cần thực hiện các thao tác trên tất cả các cạ trong đồ ị, cấu trúc ma trận kề có thể nhanh hơn nh th
2 Cài đặt giải thuật (mã giả)
Cấu trúc Node:
struct Node{
struct Node* next;
intvertex;
};
Cấu trúc đồ thị:
struct Graph{
struct Node**adj_list;
intnum_vertices;
};
Khởi tạo Node:
struct Node*createNode(int v){
struct Node *newNode =(struct Node*)malloc(sizeof(struct
Node));
if(newNode!=NULL){
newNode->next = NULL;
newNode->vertex = v
returnnewNode;
}
return NULL;
}
Trang 6
Thêm cạnh:
voidaddEdge(struct Graph* graph,FILE* file){
intsrc dest, ;
struct Node*check,*newNode;
intcount=0
while(fscanf(file,"%d\t%d",&src,&dest) !=EOF){
newNode=createNode(dest);
if(newNode!=NULL){
if (graph->adj_list[src] !=NULL) {
check= graph->adj_list[src];
graph->adj_list[src]=newNode;
graph->adj_list[src]->next=check;
}
else{
graph->adj_list[src] =newNode;
}
}else{
printf("\n allcation failed");
}
}
}
Tạo đồ thị:
struct Graph*createGraph(int num_vertices){
struct Graph*graph = (struct Graph*)malloc(sizeof(struct Graph));
graph->adj_list =(struct Node**)malloc(num_vertices * sizeof(struct Node*));
graph->num_vertices = num_vertices;
inti;
for(i= 0; <num_vertices; ++i){
graph->adj_list[ ]i =NULL;
}
return graph;
}
Trang 7
Duyệt đồ ị theo chiều sâu: th
void DFSUtil(structGraph* graph, intv,int*visited){
visited[v]= 1
printf("%d ",v);
struct Node*temp= graph->adj_list[v];
while(temp){
intadj_vertex =temp->vertex;
if (visited[adj_vertex]){
DFSUtil(graph,adj_vertex,visited);
}
temp =temp->next;
}
}
voidDFS(struct Graph* graph, start_vertexint ){
int*visited = (int*)calloc(graph->num_vertices, sizeof(int));
DFSUtil(graph, start_vertex,visited);
free(visited);
}
Trang 8
Duyệt đồ ị theo chiềth u rng:
voidBFS(struct Graph* graph, start_vertexint , bool *visited,
int* num_vertices,int* num_edges,int* max_degree,int* min_degree){
int*queue= (int*)malloc(graph->num_vertices*sizeof(int));
struct Node*temp=NULL;
intfront = 0,rear = 0
intcurrent_vertex;
visited[start_vertex] = true;
queue rear[ ++] =start_vertex;
while(front < rear) {
intdegree=0
current_vertex = queue[front++];
++(*num_vertices);
temp =graph->adj_list[current_vertex];
while (temp){
int adj_vertex =temp->vertex;
++(*num_edges);
if(visited[adj_vertex]){
visited[adj_vertex] = true;
queue rear[ ++] =adj_vertex;
}
++degree;
temp = temp->next;
}
*max_degree =(*max_degree<= degree) ?degree
*max_degree;
*min_degree =(*min_degree>= degree) ?degree
*min_degree;
}
free(queue);
}
Trang 9
Đếm số thành phần liên thông:
void findConnectedComponents(structGraph* graph){
bool*visited =(bool calloc*) (graph->num_vertices,
sizeof(bool));
intnum_components = 0
intv
for(v = 0;v <graph->num_vertices;v++){
if (graph->adj_list[v]!=NULL&&!visited v[ ]) {
num_components++;
int num_vertices= 0
int num_edges =0
int component_max_degree =0
int component_min_degree =graph->num_vertices;
BFS(graph,v,visited,&num_vertices,&num_edges,
&component_max_degree,&component_min_degree);
printf("Connected Component %d:\n",num_components);
printf("Number of vertices: %d\n",num_vertices);
printf("Number of edges: %d\n",num_edges);
printf("Max degree: %d\n",component_max_degree);
printf("Min degree: %d\n",component_min_degree);
}
}
printf("Total number of connected
components: %d\n",num_components);
free(visited);
}
Trang 103 Kết quả ực nghiệm th
Khi chạy chương trình:
_Chọn 1 để nạ đồ thị vào hệ ống khi đó sẽ ện ra 1 menu mớ để ọn 1 trong p th hi i ch
3 file text để hệ ống đọc.th
Khi chọn 1:
Trang 11
Kết quả ức năng duyệt theo chiềch u rng BFS:
Trang 12
Kết quả ức năng đếch m số thành phần liên thông:
Trang 134 Kết luận
cho phép ta thực hiện các thao tác cơ bản trên đồ ị như duyệt đồ ị theo chiềth th u
thành phần liên thông
có cơ hi hiểu sâu hơn về đồ ị và cấu trúc dữ ệu phù hợth li p để lưu trữ và xử lý
chúng ta đã có khả năng tương tác với dữ liệu từ thư viện đ thồ ị SNAP và thực hiện các thao tác trên đồ ị mt cách hiệth u qu ả
Qua quá trình thực hiện bài toán, chúng ta cũng đã nắm vững các khái niệm cơ bản trong lĩnh vực đ thồ ị và cải thiện kỹ năng lập trình C của mình Báo cáo này cung cấp mt cái nhìn tổng quan về ệc cài đặt cấu trúc dữ ệu đơn đồ ị vô vi li th hướng và thực hiện các thao tác cơ bản trên đồ ị th
ứng dụng thự ế có hiệu suất cao và đáng tin cậy trên các đồ ị ực tế c t th th