Trong bài viết này chúng ta sẽ cùng tìm hiểu một số bài tập về đồ thị mời các bạn xem ngay bên dưới.
Hướng dẫn code kiểm tra đồ thị có hợp lệ và vô hướng hay có hướng không
1. Khai báo kiểu cấu trúc có tên đồ thị
#include <stdio.h> #define MAX 100 struct DoThi{ int n; int a[MAX][MAX]; }; |
2. Hàm đọc đồ thị từ file text trong máy tính
void DocDoThi(char *s, DoThi &g){ FILE *f; f = fopen(s,”rt”); if(f==NULL){ printf(“Khong tim thay tap tin”); return; } fscanf(f,”%d”,&g.n); for(int i=0; i<g.n;i++) for(int j=0; j<g.n; j++) fscanf(f,”%d”,&g.a[i][j]); } |
3. Xuất đồ thị
void XuatDoThi(DoThi g){ printf(“\n %d”,g.n); for(int i=0; i<g.n; i++){ printf(“\t”); for(int j=0; j<g.n;j++) printf(“%d “,g.a[i][j]); printf(“\n”); } } |
4. Kiểm tra đồ thị đơn có hợp lệ hay không
Đồ thị đơn hợp lệ là đồ thị có đường chéo chính bằng 0 và ngược lại
int KiemTraDoThiDon(DoThi g){ for(int i=0; i<g.n; i++){ if(g.a[i][i] != 0){ return 0; return 1; } } } |
5. Kiểm tra đồ thị đơn là vô hướng hay có hướng
- Đồ thi đơn vô hướng là đồ thị có giá trị cạnh a[i][j] = a[j][i]
- Đồ thì đơn có hướng là độ thị có giá trị cạnh a[i][j] != a[j][i]
int KiemTraDoThiDonVoHuong(DoThi g){ for(int i=0;i<g.n; i++){ for(int j=0;j<g.n;j++) if(g.a[i][j] != g.a[j][i]) return 0; return 1; } } |
Toàn bộ code
#include <stdio.h> #define MAX 100 struct DoThi{ int n; int a[MAX][MAX]; }; void DocDoThi(char *s, DoThi &g); void XuatDoThi(DoThi g); int KiemTraDoThiDon(DoThi g); int KiemTraDoThiDonVoHuong(DoThi g); int main(){ DoThi g; do{ printf(“\n 0: Thoat”); printf(“\n 1: Doc do thi”); printf(“\n 2: Xuat do thi”); printf(“\n 3: Kiem tra do thi don”); printf(“\n 4: Kiem tra do thi vo huong”); int chon; printf(“\n Lua chon chuc nang:”); scanf(“%d”,&chon); if(chon==0) return 0; if(chon==1){ char diachitaptin[30]; printf(“\n Nhap duong dan:”); scanf(“%s”,diachitaptin); DocDoThi(diachitaptin,g); } if(chon==2){ printf(“\n Do thi la:”); XuatDoThi(g); } if(chon==3){ if(KiemTraDoThiDon(g)) printf(“\n Do thi hop le”); else printf(“\n Do thi khong hop le”); } if(chon==4){ if(KiemTraDoThiDonVoHuong(g)) printf(“\n Day la do thi vo huong”); else printf(“\n Day la do thi co huong”); } printf(“\n Nhap lai menu”); }while(1); return 0; } void DocDoThi(char *s, DoThi &g){ FILE *f; f = fopen(s,”rt”); if(f==NULL){ printf(“Khong tim thay tap tin”); return; } fscanf(f,”%d”,&g.n); for(int i=0; i<g.n;i++) for(int j=0; j<g.n; j++) fscanf(f,”%d”,&g.a[i][j]); } void XuatDoThi(DoThi g){ printf(“\n %d”,g.n); for(int i=0; i<g.n; i++){ printf(“\t”); for(int j=0; j<g.n;j++) printf(“%d “,g.a[i][j]); printf(“\n”); } } int KiemTraDoThiDon(DoThi g){ for(int i=0; i<g.n; i++){ if(g.a[i][i] != 0){ return 0; return 1; } } } int KiemTraDoThiDonVoHuong(DoThi g){ for(int i=0;i<g.n; i++){ for(int j=0;j<g.n;j++) if(g.a[i][j] != g.a[j][i]) return 0; return 1; } } |