1. Trang chủ
  2. » Giáo án - Bài giảng

Ôn thi phần đồ thị lập trình có đáp án

18 312 0

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 18
Dung lượng 35,92 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Trang 1

#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 2

for(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 3

fgets(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 4

fp=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 5

for(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 6

for (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 7

BFS(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 8

if (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 9

Stack[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 10

if (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 14

for (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 15

lien 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

}

Ngày đăng: 27/04/2016, 10:47

TỪ KHÓA LIÊN QUAN

w