Code Lý thuyết Đồ Thị (Danh sách cung Ma trận)

10 7 0
Code Lý thuyết Đồ Thị (Danh sách cung  Ma trận)

Đang tải... (xem toàn văn)

Thông tin tài liệu

Code cho các bài tập Lí thuyết đồ thị về Danh sách cung, Ma trận đỉnhcung đỉnhđỉnh duyệt chiều rộng thì lấy cái bên phải cùng sang xét 8 duyệt chiều sâu thì xét cái đầu tiên bên trái sang bằng ngôn ngữ C các hàm add edge adjacent

1 Code LTDT Tuần Danh sách cung Ma trận kề Ma trận đỉnh-cung (dạng chuyển đồi) Ma trận đỉnh-đỉnh (dạng chuyển đồi) Đọc đồ thị từ tập tin tuần duyệt chiều rộng lấy bên phải sang xét duyệt chiều sâu xét bên trái sang - 10 - 11 - 12 - 13 #############################################THEO DANH SACH CUNG################################################################################## 14 !!!Cấu trúc khai báo Ctr Danh sach Cung: 15 $$Code: 16 #include 17 #define MAX_M 500 18 //Cấu trúc Edge lưu liệu cung 19 typedef struct { 20 int u, v; 21 } Edge; 22 //Khai báo cấu trúc liệu Graph 23 typedef struct { 24 int n, m; 25 Edge edges[MAX_M]; 26 } Graph; 27 28 29 30 !!!!!Đọc liệu tập tin dt.txt(Hàm nằm hàm MAIN) 31 //Đọc số đỉnh số cung & khởi tạo đồ thị 32 FILE* file = fopen("dt.txt", "r"); 33 //freopen("dt.txt", "r", stdin); 34 35 !!!!==> sau đổi scanf thành fscanf(file,"? %d",&) 36 !!!!==> xong r fclose(file); de dong file xong moi tới hàm để in hình 37 - 38 - 39 - 40 - 41 - 42 Hàm init_graph có số đỉnh n số cung ( PP Danh sách cung): 43 $$CODE: 44 void init_graph(Graph *pG, int n){ 45 pG->n=n; 46 pG->m=0; 47 } 48 - 49 Hàm add_edge() (Hàm chung nhớ tùy vào đề bớt điều kiện): 50 - 51 Cơ cần điều kiện(trùng , uv vu phân biệt): 52 $$CODE: 53 54 void add_edge(Graph *pG, int u, int v) { 55 if (u>0 && un && v>0 && vn) { 56 // Thêm cung (u, v) vào danh sách cung đồ thị 57 pG->edges[pG->m].u = u; 58 pG->edges[pG->m].v = v; 59 pG->m++; 60 } 61 } 62 63 Nâng cao uv có không thêm vào tham số hợp lệ (nếu không hợp lệ thêm điều kiện vào if hàm void) Có hướng: 64 $$CODE: 65 66 void add_edge(Graph *pG, int u, int v) { 67 for (int i = 0; i < pG->m; i++) 68 if (pG->edges[i].u == u && pG->edges[i].v == v) 69 return; 70 pG->edges[pG->m].u = u; 71 pG->edges[pG->m].v = v; 72 73 pG->m++; 74 } 75 - 76 Nâng cao cung (u, v) cung (v, u) có đồ thị bỏ qua, không thêm vào nữa(không cho (1,1) luôn) Vô hướng: 77 void add_edge(Graph *pG, int u, int v) { 78 if (u == v) 79 return; 80 for (int i = 0; i < pG->m; i++) 81 if ((pG->edges[i].u == u && pG->edges[i].v == v) || 82 (pG->edges[i].u == v && pG->edges[i].v == u) || u==v) 83 return; 84 pG->edges[pG->m].u = u; 85 pG->edges[pG->m].v = v; 86 pG->m++; 87 } 88 - 89 - 90 - 91 92 3.Hàm adjacent(Graph *pG, int u, int v) để kiểm tra đỉnh u có kề với đỉnh v không theo mẫu (prototype): 93 $$CODE: 94 95 int adjacent(Graph *pG, int u, int v) { 96 int i; 97 for (i = 0; i < pG->m; i++) 98 if ((pG->edges[i].u == u && pG->edges[i].v == v) || 99 (pG->edges[i].u == v && pG->edges[i].v == u)) 100 return 1; 101 return 0; 102 } 103 104 - 105 - 106 - 107 108 Hàm degree(Graph *pG,int u) Đếm bậc đỉnh u đồ thị bất kỳ: 109 $$CODE: 110 int degree(Graph *pG, int u) { 111 int e, deg_u = 0; 112 //Duyệt qua cung 0, 1, 2, …, m - 113 for (e = 0; e < pG->m; e++) { 114 //Nếu cung có dạng (u, -) 115 if (pG->edges[e].u == u) 116 deg_u++; 117 //Nếu cung có dạng (-, u) 118 if (pG->edges[e].v == u) 119 deg_u++; 120 } 121 122 return deg_u; 123 } 124 Trong ham main: 125 for (int u = 1; u n=n; 191 pG->m=0; 192 for(int u=1;uA[u][v] += 1; 204 if(u != v){ 205 pG->A[v][u] += 1; 206 } 207 pG->m++; 208 } 209 - - 210 - 211 #######MA TRẬN KỀ đồ thị có hướng đa cung đa khuyên 212 #######chỉ cần thay đổi hàm add_edge khơng cần if có hướng sdung hàm 213 void add_edge(Graph *pG, int u, int v) { 214 pG->A[u][v] += 1; 215 pG->m++; 216 } 217 218 - 219 ##Hàm In ma trận kề man hình 220 printf("Ma tran ke:\n"); 221 for (int u = 1; u A[u][u]; 238 } 239 240 - - 241 242 * #####hàm Degree "Ma trận kề" dùng để lưu trữ đồ thị có hướng (có thể chứa đa cung chứa khuyên) 243 int degree(Graph *pG,int u){ 244 int v, deg_u=0; 245 for(v=1; vn ; v++){ 246 deg_u += pG->A[u][v] + pG->A[v][u]; 247 } 248 return deg_u; 249 } 250 - - 251 252 253 * #####Hàm indegree "Ma trận kề" dùng để lưu trữ đồ thị có hướng (có thể chứa đa cung chứa khuyên) 254 int indegree(Graph *pG, int u){ 255 int v, deg_u=0; 256 for(v = 1;vn; v++){ 257 deg_u += pG->A[v][u]; 258 } 259 return deg_u; 260 } 261 - - 262 263 * ####Hàm outdegree "Ma trận kề" dùng để lưu trữ đồ thị có hướng (có thể chứa đa cung chứa khuyên) Giống hàm degree vô hướng but return deg_u 264 int outdegree(Graph *pG,int u){ 265 int v, deg_u=0; 266 for(v=1; vn ; v++){ 267 deg_u += pG->A[u][v]; 268 } 269 return deg_u; 270 } 271 272 * ##### Hàm neighbours in ma trận kề vô hướng giống dsach cung thay đổi if cịn có hướng đổi điều kiện add_edge 273 for (int u = 1; u 0) { 418 push_back(&L, y); 419 break; 420 } 421 } 422 return L; 423 } 424 425 "Ma trận đỉnh - đỉnh" dùng để biểu diễn đơn đồ thị vô hướng 426 427 Viết hàm int deg(Graph* G, int x) để tính bậc đỉnh u theo mẫu (prototype): ( *G *pG) 428 429 int deg(Graph* pG, int x){ 430 int de=0; 431 int i; 432 for(i=1;in;i++) 433 if(pG->A[x][i]==1) 434 de++; 435 return de; 436 } 437 438 439 Bài - Ứng dụng: Tìm đỉnh có bậc lớn 440 Viết chương trình tính in hình đỉnh có bậc lớn bậc tương ứng 441 Nếu có nhiều đỉnh có bật in đỉnh có số thứ tự nhỏ 442 443 ** #include 444 #define MAX_N 100 445 446 * typedef struct { 447 int A[MAX_N][MAX_N]; 448 int n; 449 } Graph; 450 451 * void init_graph(Graph *pG, int n) { 452 pG->n = n; 453 for (int i = 0; i < n; ++i) { 454 for (int j = 0; j < n; ++j) { 455 pG->A[i][j] = 0; 456 } 457 } 458 } 459 460 * void add_edge(Graph *pG, int u, int v) { 461 pG->A[u][v] = 1; 462 pG->A[v][u] = 1; 463 } 464 465 * int deg(Graph *pG, int u) { 466 int degree = 0; 467 for (int i = 0; i < pG->n; ++i) { 468 degree += pG->A[u][i]; 469 } 470 return degree; 471 } 472 473 * int main() { 474 Graph pG; 475 int n, m; 476 scanf("%d %d", &n, &m); 477 init_graph(&pG, n); 478 * for (int i = 0; i < m; ++i) { 479 int u, v; 480 scanf("%d %d", &u, &v); 481 add_edge(&pG, u - 1, v - 1); 482 } 483 int maxDegree = -1; 484 int maxVertex = -1; 485 * for (int u = 0; u < n; ++u) { 486 int degree = deg(&pG, u); 487 if (degree > maxDegree || (degree == maxDegree && u < maxVertex)) { 488 maxDegree = degree; 489 maxVertex = u; 490 } 491 } 492 *In printf("%d %d\n", maxVertex + 1, maxDegree); 493 494 return 0; 495 } 496 497 498 Bài - Đọc đồ thị từ tập tin 499 Hãy viết chương trình đọc đồ thị từ tập tin hiển thị ma trận kề đồ thị 500 501 Giả sử đồ thị cho đồ thị vô hướng đơn 502 503 Đầu vào (Input): 504 505 Dữ liệu đầu vào nhập từ tập tin dt1.txt với định dạng: 506 507 - Dòng chứa số nguyên n m, tương ứng số đỉnh số cung 508 509 - m dòng dòng chứa số nguyên u v mô tả cung (u, v) 510 511 Đầu (Output): 512 513 In Ma trận kề (0/1) đồ thị 514 515 #include 516 #define MAX_N 100 517 518 * typedef struct { 519 int A[MAX_N][MAX_N]; 520 int n; 521 } Graph; 522 523 * void init_graph(Graph *pG, int n) { 524 pG->n = n; 525 for (int i = 0; i < n; ++i) { 526 for (int j = 0; j < n; ++j) { 527 pG->A[i][j] = 0; 528 } 529 } 530 } 531 532 * void add_edge(Graph *pG, int u, int v) { 533 pG->A[u][v] = 1; 534 pG->A[v][u] = 1; 535 } 536 537 * void hienthi_matran(Graph *pG) { 538 for (int i = 0; i < pG->n; ++i) { 539 for (int j = 0; j < pG->n; ++j) { 540 printf("%d ", pG->A[i][j]); 541 } 542 printf("\n"); 543 } 544 } 545 546 * int main() { 547 Graph pG; 548 int n, m; 549 * // Đọc file 550 FILE *file = fopen("dt1.txt", "r"); 551 if (file == NULL) { 552 printf("Cannot open file dt1.txt\n"); 553 return 1; 554 } 555 fscanf(file, "%d %d", &n, &m); 556 init_graph(&pG, n); 557 for (int i = 0; i < m; ++i) { 558 int u, v; 559 fscanf(file, "%d %d", &u, &v); 560 add_edge(&pG, u - 1, v - 1); 561 } 562 * // Đóng file 563 fclose(file); 564 * // hien thi ma tran 565 hienthi_matran(&pG); 566 return 0; 567 } 568 569 - 570 571 572

Ngày đăng: 01/03/2024, 22:59

Tài liệu cùng người dùng

Tài liệu liên quan