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;
}
```
Nhập xuất ma trận
Bạn tạo ra biến g, rồi k khởi tạo, cứ thế mà chạy. 
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.
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, 
#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. 
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
Nếu đã OK tất cả nhớ tích solution nha. 
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?