Nhập xuất ma trận

void Input(int a[][100], int n)
{
    for (int i=0; i<n; i++)
        for (int j=0; j<n; j++)
        {
            printf("\nNhap a[%d][%d]: ",i,j);
            scanf("%d", &a[i][j]);
        }
}
 
void Output(int a[][100], int n)
{
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            printf("%4d",a[i][j]);
        }
        printf("\n");
    }
}

int main(){ 
	int n;
	int a[100][100];
	printf("\nNhap vao so phan tu cua mang: ");
	scanf("%d",&n);
	NhapMaTran(a,n);
	XuatMaTran(a,n);
	getch();
	return 0; 
}
```

Bạn tạo ra biến g, rồi k khởi tạo, cứ thế mà chạy. :point_down:

Rồi trong vòng for

nó đâu biết g.n của bạn là bao nhiêu đâu, có thể là 0, 1 hay 1 tỷ, ai biết được, và nó cứ gán như vậy cho đến khi quá số lượng mà bạn cho phép, đến lúc đó.
Máy tính bảo: “ơ, mày xin tao có 100k thôi mà, định lấy thêm 1k nữa hả, cút!”
và thế là chg trình của bạn bị out.
Bạn nên sửa lại hết n thành g.n, a[][] thành g.a.

1 Like

bác có thể giúp e sửa lại code ko ạ ? E có sửa lại r nhưng chạy sai, đáng lẽ đây là đồ thị có hướng nhưng mà nó lại ra vô hướng
Mong bác giúp cho trót =v=

Bạn thử chạy code này, :point_down:

#define MAX 100
#define inputfile "C:/test8.txt"
#include<stdio.h>
#include<conio.h>
/*
0 2 0 4
2 0 3 1
0 3 0 2
4 1 2 0
*/
typedef struct GRAPH {
	int n;
	int a[MAX][MAX];
} DOTHI;

void NhapMaTran(int a[][MAX], int n) {
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++) {
			printf("\nNhap a[%d][%d]: ",i,j);
			scanf("%d", &a[i][j]);
		}
}

void XuatMaTran(int a[][MAX], int n) {
	for(int i = 0; i < n; i++) {
		for(int j = 0; j < n; j++) {
			printf("%4d", a[i][j]);
		}
		printf("\n");
	}
}

typedef struct EDGE {
	int u;
	int v;
	int value;
} CANH;

void SapXepTang(CANH E[MAX], int tongsocanh) {
	CANH canhtam;
	for(int i = 0 ; i < tongsocanh - 1 ; i++) {
		for(int j = i + 1 ; j < tongsocanh ; j++)
			if(E[i].value > E[j].value) {
				canhtam = E[i];
				E[i] = E[j];
				E[j] = canhtam;
			}
	}
}

void Kruskal (DOTHI	g) {
	CANH listEdge[MAX];
	int tongsocanh = 0;
	int i, j;
	for(i = 0; i < g.n; i++) {
		for(j = i+1; j < g.n; j++)
			if(g.a[i][j] > 0) {
				listEdge[tongsocanh].u = i;
				listEdge[tongsocanh].v = j;
				listEdge[tongsocanh].value = g.a[i][j];
				tongsocanh++;
			}
	}
	SapXepTang(listEdge, tongsocanh);
	int nT = 0;
	CANH T[MAX];
	int nhan[MAX];
	for (i = 0; i < g.n ; i++)
		nhan[i] = i;
	int canhdangxet = 0;
	while(nT < g.n && canhdangxet < tongsocanh) {
		if (nhan[listEdge[canhdangxet].u] != nhan[listEdge[canhdangxet].v]) {
			T[nT] = listEdge[canhdangxet];
			nT++;
			int giatri = nhan[listEdge[canhdangxet].v];
			for (j = 0; j < g.n; j++)
				if (nhan[j] == giatri)
					nhan[j] = nhan[listEdge[canhdangxet].u];
		}
		canhdangxet++;
	}
	if(nT != g.n -1)
		printf("\nDo thi khong lien thong \n");
	else {
		int TongTrongSoCuaCayKhung = 0;
		printf("\nDo thi lien thong \n");
		printf ("Cay khung nho nhat cua do thi la \n");
		for (i = 0; i < nT; i++) {
			printf("(%d,%d), ", T[i].u, T[i].v);
			TongTrongSoCuaCayKhung += T[i].value;
		}
		printf ("\nTong gia tri cua cay khung la %d\n",TongTrongSoCuaCayKhung);
	}
}

int main() {
	DOTHI g;
	printf("\nNhap vao so phan tu cua mang: ");
	scanf("%d", &g.n);
	NhapMaTran(g.a, g.n);
	XuatMaTran(g.a, g.n);
	Kruskal(g);
	getch();
	return 0;
}

P/s: Mình chỉ làm cho nó chạy đk thôi, còn hiển thị đúng hay sai là do thuật toán của bạn. :slight_smile:

1 Like

thank bác TvT mình chạy được r, thuật toán thì mình đúng 100% TvT thank bác lần nữa

1 Like

Nếu đã OK tất cả nhớ tích solution nha. :slight_smile:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?