#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 100
#define TRUE 1
#define FALSE 0
int A[MAX][MAX],u,v,
n,k,p=0,m=0,chuaxet[MAX], truoc[MAX], s, t; FILE *fp;
int solt=0,count=0;
int B[100]; //mang hi nhan cac dinh le
// -void Init(// -void) {// khoi tao gia tri ma tran
=0
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
A[i][j]=0;
}
// -void ReInit(// -void) { // khoi tao gia tri mang
chua xet
for (int i=1; i<=n; i++) {
chuaxet[i]=TRUE;truoc[i]=0;
}
}
// -int Test_So_Lien_Thong(void) { //Kiem tra so
lien thong >1?
Trang 2for(int u=1; u<=n; u++)
if(chuaxet[u]) return(1);
return(0);
}
// -void read_MTK(// -void){//doc du lieu ma tran ke int i,j;FILE *fp;
fp=fopen("dothi.in","r");
//fscanf(fp,"%d%d%d",&n,&s,&t);// cho tim duong di
//fscanf(fp,"%d",&n); // cho duyet cau euler
fscanf(fp,"%d%d",&n,&k);// cho duyet cay
khung
for(i=1; i<=n; i++){
for(j=1; j<=n; j++){
fscanf(fp,"%d",&A[i][j]);
}
}
fclose(fp);
}
// -void read_DSK(// -void){ //Doc danh sach ke sang
ma tran ke
int dau, cuoi; char str[132], tu[12];
//Doc va chuyen doi thanh ma tran ke
fp = fopen("DSKE.TXT","r");
if(fp==NULL){
printf("\n Do thi khong ton tai"); getch(); return;
Trang 3fgets(str, 132, fp);n = atoi(str);
Init();
for( dau=1; dau<=n; dau++){
fgets(str,132,fp);
for(int j=0, p=0; j<=strlen(str); j+ +){
//tach tu
if(str[j]!=' '&&str[j]!
='\t'&&str[j]!='\0'&& str[j]!='\n'){
tu[p]=str[j]; p++;
} else if( p>0 && (str[j]==' '||
str[j]=='\t'||str[j]=='\0'||str[j]=='\n')){
tu[p]='\0';
p=0;cuoi=atoi(tu);
if(cuoi!=0) { m++; A[dau] [cuoi]=1; }
//thiet lap gia tri cho
ma tran ke
} }
}
fclose(fp);
}
// -void read_DSC(// -void){//Doc danh sach canh
sang ma tran ke
Trang 4fp=fopen("dscanh.in","r");
fscanf(fp,"%d%d",&n,&m);
printf("\n So dinh do thi:%2d",n); Init();
for(int i=1;i<=m;i++){
fscanf(fp,"%d%d",&u,&v);
A[u][v]=A[v][u]=1;
}
fclose(fp);
}
// -void DFS(int u){//Thuat toan DFS
int v;
chuaxet[u]=FALSE;
for(v=1; v<=n; v++){
if(A[u][v] && chuaxet[v]){
truoc[v]=u;
DFS(v);
} }
}
// -void BFS(int i){ //Thuat toan BFS
int queue[MAX], low=1, high=1, u, v;
queue[low]=i;
chuaxet[i]=FALSE;
while(low<=high){
u = queue[low];low=low+1;
Trang 5for(v=1; v<=n; v++){
if(A[u][v] && chuaxet[v]){
high = high+1;queue[high]=v;
truoc[v]=u; chuaxet[v]=FALSE;
} }
} }
// -void Duongdi (// -void){//thuat toan tim duong
di
FILE *fp;
fp = fopen("ketqua.out","w");
if (truoc[t]==0){
printf("\n Khong ton tai duong di");
getch(); return;
} int j = t;fprintf(fp,"%3d<=",j);
while(truoc[j]!=s){
fprintf(fp,"%3d<=",truoc[j]);j=truoc[j];
}
fprintf(fp,"%3d",s);
fclose(fp);
}
// -void duyetcau(// -void){//Duyet canh cau DFS
Hoac BFS
fp = fopen("ketqua.out","w");
Trang 6for (int u=1; u<n; u++){
for(int v=u+1;v<=n; v++){
if(A[u][v]) { //Neu (u,v) la mot canh
A[u][v]=0; A[v][u]=0;//Loai canh
DFS(1);
//BFS(1);
if(Test_So_Lien_Thong()) {
fprintf(fp,"\n %d %3d",u,v);
count = count+1; // bien dem canh
cau
} A[u][v]=1; A[v][u]=1;
ReInit();//Khoi tao lai mang chuaxet
} }
} rewind(fp);//tro ve dau file de in fprintf(fp,"%d\n",count); // ghi
gia tri tong so canh cau
fclose(fp);
}
// -void duyettru(// -void){//Duyet tru
fp = fopen("ketqua.out","w");
for (int u=1; u<=n; u++){
chuaxet[u]=FALSE;
if (u==1)
Trang 7BFS(2);
else
DFS(1);
//BFS(1);
if(Test_So_Lien_Thong()) {
fprintf(fp,"\n%3d",u);
count = count+1; // bien dem
dinh tru
}
} rewind(fp);//tro ve dau file de in fprintf(fp,"%d\n",count); // ghi
gia tri tong so dinh tru
fclose(fp);
}
// -int Test_Euler(void) {//Kiem tra bac Euler
int i, j;
int bac=0;
int dem1=0; //dem so dinh bac chan
int dem2=0; //dem so dinh bac le
for(i = 1; i <=n; i++) {
bac=0;
for(j = 1; j <= n; j++)
bac=bac + A[i][j];// tinh tong cac
gia tri hang i
Trang 8if (bac%2 == 0) { // toan bo hang
la chan
dem1++; // dem tong so hang
chan
}
else {
dem2++; // dem tong dinh bac le B[i]=i;
v=i;
} }
if (dem1==n) return (1); // do thi la
euler
else
if (dem2==2){
for (int i=1;i<dem2;i++){
if (B[i]!=0) u=B[i] ;//do thi la nua
eule
return(-1);
}
}else
return(0);
}
// -void Chu_trinh_Euler(int u) {//tinh chu
trinh Euler
int Stack[100], CE[100], top = 0, count =
0;
int i, S;
Trang 9Stack[top++] = u;
while (top != 0) {
S = Stack[top - 1];
i = 1;
while ((i <= n) && A[S][i] == 0) i++;
if (i <= n) {
Stack[top++] = i;
A[S][i] ;
A[i][S] ;
} else {
CE[count++] = S;
top ;
} }
printf("\nchu trinh Euler bat dau tu %d
la :", u);
for (i = count - 1; i >= 0; i )
printf("%5d", CE[i]);
}
// -void duongdi_EULER(int u, int n){//Duong di
Euler
int v, x, top, dCE;
int stack[MAX], CE[MAX];
top=1; stack[top]=u;dCE=0;
do {
v = stack[top];x=1;
while (x<=n && A[v][x]==0)
Trang 10if (x>n) {
dCE++; CE[dCE]=v; top ;
}
else {
top++; stack[top]=x;
A[v][x]=0; A[x][v]=0;
}
} while(top!=0);
printf("\n Co duong di Euler:");
for(x=dCE; x>0; x )
printf("%3d", CE[x]);
}
// -void Lietke_Euler(// -void){//liet ke Euler
int a=Test_Euler();
if (a==0) printf("G khong phai do thi Euler");
else
if (a==-1) {
printf("G la do thi nua Euler,");
duongdi_EULER(u,n);
} else
if (a==1) {
printf("G la do thi Euler, hay nhap
dinh u bat dau cua chu trinh euler can tim:
");
scanf("%d", &u);
Trang 11}
}
// -int Test_Euler_CH(void) {
int dinhxuatphat = 0, dinhketthuc = 0; int i, j, bacra, bacvao, sodinh = 0;
for(i = 1; i <=n; i++) {
bacra = 0; bacvao = 0;
for(j = 1; j <= n; j++) {
bacra += A[i][j];
bacvao += A[j][i];
}
if (bacra == bacvao) sodinh++;
else if (bacra - bacvao == 1)
dinhxuatphat = i;
else if (bacvao - bacra == 1)
dinhketthuc = i;
else return(0);
}
if (sodinh ==n) return(1); // Do thi la
Euler
else
if (sodinh == (n -2) && dinhketthuc != 0
&& dinhxuatphat != 0) {
u=dinhxuatphat;
v=dinhketthuc;
return(-1);
}else
Trang 12}
void Lietke_Euler_CH(void){//liet ke Euler int a=Test_Euler_CH();
if (a==0) printf("G khong phai do thi Euler");
else
if (a==-1) {
printf("G la do thi nua Euler, "); duongdi_EULER(u,n);
} else
if (a==1) {
printf("G la do thi Euler, hay nhap
dinh u bat dau cua chu trinh euler can tim:
");
scanf("%d", &u);
Chu_trinh_Euler(u);
}
}
// -int kiemtralienthong(void) { //Kiem tra tinh
lien thong
ReInit();
for (int u=1; u<=n; u++){
chuaxet[u]=FALSE;
DFS(u);
//BFS(u);
if(Test_So_Lien_Thong()) return(0);
Trang 13}
return(1);
}
// -void tinhlienthong(// -void){ // tinh so lien
thong
fp = fopen("ketqua.out","w");
if(kiemtralienthong())
printf("\n Do thi 1 thanh phan lien
thong");
else {
ReInit();
for(u=1;u<=n; u++){
if(chuaxet[u]){
solt++;
printf("\n TP.Lien thong %d\n", solt);
fprintf(fp,"%d\n",solt);
//BFS(u);
DFS(u);
}
}
}
fclose(fp);
}
// -int Strong_Conective (void) { //Kiem tra
tinh lien thong manh
Trang 14for (int u=1; u<=n; u++){
chuaxet[u]=FALSE;
//DFS(u);
BFS(u);
if(Test_So_Lien_Thong()) return(0);
ReInit();
}
return(1);
}
// -void lienthongmanh(// -void){
fp = fopen("ketqua.out","w");
if(Strong_Conective())
printf("\n Do thi lien thong manh");
else {
printf("\n Do thi khong lien thong manh
");
ReInit();
for(u=1;u<=n; u++){
if(chuaxet[u]){
solt++;
//BFS(u);
DFS(u);
}
}
if(solt==1) printf("Do thi la lien thong yeu") ;
else printf(" Do thi thanh phan
Trang 15lien thong la :%2d",solt);
}
fclose(fp);
}
// -void Cay_BFS(int u) {
int queue[100], in = 1, out = 1, s, t;
queue[in] = u; chuaxet[u] = 0;
while (out <= in) {
s = queue[out];
for (t = 1; t <= n; t++) {
if (chuaxet[t] && A[s][t]) {
in++; queue[in] = t; chuaxet[t]
= 0;
fprintf(fp, "\n%d%3d", s, t); count++;
} }
out++;
}
}
// -void Cay_DFS(int u) {
int i;
chuaxet[u] = 0;
for (i = 1; i <= n; i++) {
if (chuaxet[i] && A[u][i]) {
p++;
fprintf(fp, "\n%d %d", u, i);
Trang 16} }
}
// -int main (void){
fp = fopen("ketqua.out","w");
//Chu y doc casc gia tri so dinh n,k,s trong doc gia tri
read_MTK(); // dang ma tran Ke //read_DSK(); //dang danh sach Ke
//fp = fopen("DSKE.TXT","r");
//fscanf(fp,"%d%d%d",&n,&s,&t);//doc
3 dinh danh sach ke
//read_DSC(); //dang danh sach Canh
ReInit(); // khoi tao mang chua xet
// -Bat dau tim duong di
//DFS(s);
//BFS(s);
//Duongdi ();
// Ket thuc tim duong di
// Bat dau duyet cau
//duyetcau();
//ket thuc duyet cau
// Bat dau duyet tru
//duyettru() ; //ket thuc duyet tru //Bat dau tim Euler vo huong
//Lietke_Euler();
Trang 17//Ket thuc Euler vo huong
//Bat dau tim Euler vo huong
// Lietke_Euler_CH();
//Ket thuc Euler vo huong
//Bat dau Dung DFS//BFS tinh lien thong
//tinhlienthong();
//Ket thuc Dung DFS//BFS tinh lien thong
//Bat dau Dung DFS//BFS tinh lien thong manh //lienthongmanh();
//Ket thuc Dung DFS//BFS tinh lien thong manh
// dau dau duyet cay
//+chi phi thap
//Cay_DFS(k);
//rewind(fp);
//fprintf(fp, "%d %d", n, p);// cho DFS
//+chi phi cao
//Cay_BFS(k);
//rewind(fp);
//fprintf(fp, "%d%3d", n, count); //// cho BFS
// ket thuc duyet cay
fclose(fp);
Trang 18
}