You are on page 1of 23

TH Ton Ri Rc

Trang 1

TRNG I HC BCH KHOA NNG KHOA CNG NGH THNG TIN

BN BO CO

THC HNH TON RI RC

Gio vin hng dn: Nhm : Lp : Sinh vin thc hin :

Thy Nguyn Vn Nguyn 07T1 Nguyn Th Qunh Mai

Nng Thng 8/2010 SV: Nguyn Th Qunh Mai Lp 07T1

TH Ton Ri Rc

Trang 2

LI NI U Ngy nay, Cng ngh thng tin l mt trong nhng ngnh ang pht trin rt mnh m v c nh hng su rng n mi mt i sng. N l nn tng ca nn kinh t tri thc, l thc o trnh pht trin ca mt quc gia.V vy, vic o to i ng k s cng ngh thng tin c cht lng i hi phi c ch trng v u t ng mc. i hc l mi trng c bn cung cp kin thc chuyn mn, gip sinh vin hnh thnh v pht trin nhng k nng cn thit cho cng vic. V vy, hc i i vi hnh lun l phng chm o to hng u trong cc trng i hc hin nay. Cng vi hc phn l thuyt, hc phn Thc Hnh Ton Ri Rc gip nng cao kh nng t duy ca sinh vin. Trn c s bi thc hnh c nhn, sinh vin phi bit cch phn tch v ci t gii quyt cc bi ton lit k, lp lch, nhm gii quyt nhng bi ton c tnh ng dng thc t cao. Em xin chn thnh cm n gio vin hng dn thy Nguyn Vn Nguyn gip v ch dn em hon thnh bi bo co ny. Nng, ngy 9 thng 7 nm 2010

SV: Nguyn Th Qunh Mai

Lp 07T1

TH Ton Ri Rc

Trang 3

MC LC I. BI 1: BI TON M BI TON LIT K......................................4 1. bi:......................................................................................................4 2.Thut ton:................................................................................................4 3.M ngun:................................................................................................6 4.Demo: ....................................................................................................10 II. BI 2:BI TON TI U RI RC.....................................................12 1. bi:....................................................................................................12 2.Thut ton:..............................................................................................12 3.M ngun:..............................................................................................13 4.Demo:.....................................................................................................17 III.BI 3: BI TON TRN TH.........................................................18 1. bi:....................................................................................................18 2.Thut ton:..............................................................................................18 3.M ngun:..............................................................................................19 4.Demo: .................................................................................................22

SV: Nguyn Th Qunh Mai

Lp 07T1

TH Ton Ri Rc

Trang 4

I. BI 1: BI TON M BI TON LIT K 1. bi:


1. m s xu nh phn di n: a) Bt k. b) Khng c hai bit 0 k nhau. c) C t nht hai bit 0 k nhau. 2. Vit chng trnh lit k tt c cc xu nh phn di n nh yu cu ca bi ton 1. Lit k c s th t kim tra kt qu m c. Th nhp vi nhiu gi tr khc nhau ca n. Lu cc trng hp n=1 v n=2. 3. Vit chng trnh nhp mt xu ch gm n ch ci hoa (A..Z)-trong c mt s ch ci lp. Lit k tt c cc cch sp xp n ch ci ny. C m tng s cch sp xp. 4. Xt phng trnh nguyn: x1+x2+..+xn=k vi xi0 i=1..k. Vit chng trnh nhp n,k v in ra tt c cc nghim ca phng trnh.C m tng s nghim.

2.Thut ton: 2.1. m s xu nh phn di n: a. Bt k: S xu nh phn di n chnh l 2n. b. Khng c hai bit 0 k nhau: - Nu n=1: c 2 xu. - Nu n=2: c 3 xu. - T n>2 tr i th s xu nh phn di n chnh bng tng ca s xu nh phn di n-1 v s xu nh phn di n-2. c. C t nht 2 bit 0 gn nhau: S xu cn tm chnh bng s xu tm c cu a tr i s xu tm c cu b. 2.2. Thut ton lit k cc xu nh phn: gii quyt bi ton ny,ta s xy dng cc hm v dng thut ton quay lui gii Thut ton c th c m t nh sau: Khai bo bin ton cc:mng s[100],n,d=0; l kiu nguyn Cn to hm print(tham s);Lke(tham s); - void print(tham s): 1.Khai bo bin k kiu nguyn; 2.Gn k=0 v lp cho ti khi cu hnh C mi bc lp th in ra phn t ca mng s SV: Nguyn Th Qunh Mai Lp 07T1

TH Ton Ri Rc

Trang 5

Tng bin m ln 1 n v d++ - void Lke(tham s): 1.Khai bo bin j kiu nguyn; 2.Gn j=0 v lp cho ti khi j=1 -C mi bc gn j vo cho mng s -Nu cu hnh th in mng s -Khc th quay lui li hm Lke(thamso+1) - Hm main(): a) Khai bo i kiu nguyn; b) Qut gi tr di xu nh phn vi n khai bo ton cc, n>=1; c) Gi hm Lke(0); truyn tham s i=0 cho ln u tin gi hm; d) In ra s xu nh phn m c:printf(%d,d); 2.3. Lit k t hp khng lp ca xu ch ci: Ta da vo phng php sinh. Bao gm cc bc: Bc 1: Xy dng cu hnh u tin cho xu theo th t t in 1 Xp xp li xu theo chiu gim a[i]>=a[i+1] vi i= 1, n . In ra cu hnh u tin ny v bin m s cch sp xp c khi to gi tr bng 1. Bc 2: Lp cho ti khi t c cu hnh cui c dng a[i]<=a[i+1] 1 vi i= 1, n . Trong qu trnh lp sinh xu k tip bng cch hon i v tr 2 phn t a[i] a[j] cho nhau .iu kin ca i l tt c cc phn t ca xu bn tri v tr i c sp xp theo chiu tng tr phn t i .V cc phn t ca xu c lu vo v tr t 0 n n-1 nn vi i=n chnh l iu kin thot khi vng lp .iu kin ca j l 1 trong i-1 phn t bn tri ca phn t i c gi tr nh nht nhng a[j]>a[i] .V dy bn tri ca phn t th i l dy tng do j chnh l v tr ca phn t u tin ln hn a[i] nu j=1 i-1 .Sau khi hon v a[i] v a[j] cho nhau ta sp xp li tt c cc phn t bn tri i theo chiu gim, in ra cu hnh mi ca xu v tng bin m ln. 2.4. Gii phng trnh: x1 + x2 + x3 + + xn = k - Khai bo bin. - Khai bo thm mng a[i] in ra cc nghim ca phng trnh. - Nhp d liu n v k. - Dng bi ton chnh hp lp chp n ca k+1 phn t (0,1.,k):

SV: Nguyn Th Qunh Mai

Lp 07T1

TH Ton Ri Rc

Trang 6

+ Khai bo thm bin sum + Nu k=0 th c nghim duy nht x1 = x2 = = xn = 0; + Ngc li gn a[i]=0; Thay i a[i] c a[i] k tip theo bi ton chnh hp lp. Gn sum=a[i]; nu (sum =k) in kt qa a[i]; - Thut ton chnh hp lp chp k ca n phn t (phng php lit k) Void Lke(int n,int k){ For(i=1;i<=k;i++) s[i]=1; Print(s); For(dem=2;dem<=Fkn; dem++) { i=k; while(s[i]==n) i--; s[i]++; for(j=i+1;j<=k;j++) s[j]=1; print(s); } } 3.M ngun: - Cu 1:
#include<conio.h> #include<stdio.h> #include<math.h> int DemXau1(int n); int DemXau2(int n); int DemXau3(int n); void main(){ clrscr(); int n; printf("Enter n="); scanf("%d",&n); printf("\nSo xau nhi phan bat ky do dai %d: %d xau.",n,DemXau1(n)); printf("\nSo xau nhi phan ko co 2 bit 0 ke nhau: %d xau.",DemXau2(n)); printf("\nSo xau nhi phan co it nhat 2 bit 0 ke nhau: %d xau.",DemXau3(n)); getch(); } int DemXau1(int n){ return pow(2,n); } int DemXau2(int n){ if(n==1) return 2; if(n==2) return 3; else return DemXau2(n-1)+DemXau2(n-2);

SV: Nguyn Th Qunh Mai

Lp 07T1

TH Ton Ri Rc

Trang 7

} int DemXau3(int n){ return DemXau1(n)-DemXau2(n); }

- Cu 2:
#include<conio.h> #include<stdio.h> #include<math.h> int n,s[50]; void Lke1(int n); void Lke2(int n); void Lke3(int n); void print(); void main(){ clrscr(); printf("Enter n="); scanf("%d",&n); printf("\n\nSo xau nhi phan bat ky do dai %d:\n ",n); Lke1(n); printf("\n\nSo xau nhi phan ko co 2 bit 0 ke nhau:\n"); Lke2(n); printf("\n\nSo xau nhi phan co it nhat 2 bit 0 ke nhau:\n"); Lke3(n); getch(); } //----------------------------------------------------void Lke1(int n){ int dem=1; for(int i=0;i<n;i++) s[i]=0; printf("\n%2d/",dem); print();//in xau 000...00 for(dem=2;dem<=pow(2,n);dem++){ i=n; while(s[i]==1) i--; s[i]++; for(int j=i+1;j<n;j++) s[j]=0; printf("\n%2d/",dem); print(); } } //----------------------------------------------------void Lke2(int n){ int dem=1,kt=0,k=0; for(int i=1;i<=n;i++) s[i]=0; for(dem=2;dem<=pow(2,n);dem++){ kt=0; i=n; while(s[i]==1) i--; s[i]++; for(int j=i+1;j<=n;j++) s[j]=0;

SV: Nguyn Th Qunh Mai

Lp 07T1

TH Ton Ri Rc

Trang 8

for(i=1;i<n;i++) if(s[i]==0 && s[i+1]==0) kt=1; if(kt==0){ k++; printf("\n%2d/",k); print(); } } } //----------------------------------------------------void Lke3(int n){ int dem=1,kt=0,k=1; for(int i=0;i<n;i++) s[i]=0; printf("%2d/",k); print(); for(dem=2;dem<=pow(2,n);dem++){ kt=0; i=n; while(s[i]==1) i--; s[i]++; for(int j=i+1;j<=n;j++) s[j]=0; for(i=1;i<n;i++) if(s[i]==0 && s[i+1]==0) kt=1; if(kt!=0){ k++; printf("\n%2d/",k); print(); } } } void print(){ for(int i=1;i<=n;i++) printf("%d",s[i]); }

- Cu 3:

#include<conio.h> #include<stdio.h> #include<string.h> void Lke(char a[],int n); void print(char a[]); void Daygiam(int n,char a[]); void main(){ clrscr(); char a[100]; int n,kt=1; do{ kt=1; printf("\nEnter the string: "); gets(a); n=strlen(a) ; for(int i=0;i<n;i++) if(a[i]<65 || a[i]>90) kt=0;

SV: Nguyn Th Qunh Mai

Lp 07T1

TH Ton Ri Rc

Trang 9

if(kt==0 || n==0) { printf("Error! Retry"); } }while(kt==0 || n==0); printf("\nXau vua nhap la: %s",a); printf("\nCac hoan vi ko lap:\n"); Lke(a,n); getch(); } void Lke(char a[],int n){ int i1=1,i2,count=1; int x; Daygiam(n,a); printf("%7d.",count); print(a); while(i1<n){ i1=1; while(a[i1-1]<=a[i1] && i1<n) i1++; i2=0; while(a[i2]<=a[i1] && i2<i1) i2++; x=a[i1]; a[i1]=a[i2]; a[i2]=x; Daygiam(i1,a); if(i1<n){ count++; printf("%7d.",count); print(a); if(count%5==0) printf("\n"); } } printf("\nCo %d hoan vi.",count); } void print(char a[]){ printf("%s",a); } void Daygiam(int n,char a[]){ int x; for(int i=0;i<n;i++) for(int j=i;j<n;j++){ if(a[i]<a[j]){ x=a[i]; a[i]=a[j]; a[j]=x; } } }

- Cu 4:
#include<conio.h> #include<stdio.h> #include<math.h> int s[50]; void Giaiptr(int n,int k); void print(int n);

SV: Nguyn Th Qunh Mai

Lp 07T1

TH Ton Ri Rc

Trang 10

void main(){ clrscr(); int n,k; printf("Enter n="); scanf("%d",&n); printf("k="); scanf("%d",&k); Giaiptr(n,k); getch(); } void Giaiptr(int n,int k){ int i,j,sum=0,c,count=0; for(i=1;i<=n;i++) s[i]=0; printf("\nNghiem cua ptr: "); if(k==0) { count++; printf("\n%4d.",count); print(n); } else{ for(c=2;c<=pow(k+1,n);c++){ sum=0; i=n; while(s[i]==k) i--; s[i]++; for(j=i+1;j<=n;j++) s[j]=0; for(i=1;i<=n;i++) sum+=s[i]; if(sum==k){ count++; printf("\n%4d.",count); print(n); } } } printf("\n\nPhuong trinh co %d nghiem",count); } void print(int n){ for(int i=1;i<=n;i++) printf("%2d",s[i]); }

4.Demo: - Cu 1:

SV: Nguyn Th Qunh Mai

Lp 07T1

TH Ton Ri Rc

Trang 11

- Cu 2:

- Cu 3:

- Cu 4: SV: Nguyn Th Qunh Mai Lp 07T1

TH Ton Ri Rc

Trang 12

II. BI 2:BI TON TI U RI RC 1. bi: 1. Vit chng trnh nhp n l s chi tit cn gia cng v nhp thi gian gia cng trn hai my ca tng chi tit. Tnh v in thi gian hon thnh gia cng nhanh nht. 2. Vit chng trnh nhp n l s thnh ph v nhp ma trn khong cch Cnxn=(cij)nxn. Tm hnh trnh ngn nht cho ngi du lch. 2.Thut ton: 2.1. Bi ton lp lch: Mi mt chi tit trong s n chi tit D1, D2,, Dn cn phi c ln lt gia cng trn 2 my A, B. Thi gian gia cng chi tit Di trn my A l ai, trn my B l bi (i=1..n). Lch gia cng xong cc chi tit sm nht c trnh by theo thut ton nh sau: - Chia cc chi tit thnh 2 nhm: Nhm N1 gm cc chi tit Di tha mn ai<bi, tc l min(ai,bi) t c ti ai, v nhm N2 gm cc chi tit Di tha mn ai > bi, tc l min(ai,bi) t c ti bi. Cc chi tit Di tha mn ai = bi xp vo nhm no cng c. - Sp xp cc chi tit trong N1 theo chiu tng ca cc ai v sp xp cc chi tit trong N2 theo chiu gim ca cc bi. - Ni N2 vo N1. Dy thu c (theo tri sang phi) s l lch gia cng ti u. 2.2. Bi ton ngi du lch: Khi to cho tt c nhng cnh khng ni c vi nhau bao gm c cnh c[i][i] u c gn bng v cc cnh khng c ni vi nhau. Tng chi ph ca mt hnh trnh ca ngi du lch s cha ng mt phn t ca mi dng v ng mt phn t ca mt ct trong ma trn chi ph C. Do , nu ta tr mi phn t ca mt dng (hay ct) ca ma trn C i cng mt s th di ca tt c cc hnh trnh s cng gim i ,v th hnh SV: Nguyn Th Qunh Mai Lp 07T1

TH Ton Ri Rc

Trang 13

trnh ti u cng s khng thay i .V vy nu ta tin hnh tr bt cc phn t ca hng v ct i mt hng s sao cho thu c ma trn gm cc phn t khng m m trong mi hng v mi ct c t nht mt s 0. Ta gi tng cc hng s tr i l chi ph rt gn hay cn, qu trnh tr bt c gi l qu trnh rt gn, ma trn thu c gi l ma trn rt gn. Chi ph ca ma trn C c tnh bng tng chi ph rt gn qua cc bc bin i ma trn. V d ma trn gc th c cn = 0. Sau khi rt gn ma trn C, ta c chi ph bng iu ny c ngha l khng th tm c 1 hnh trnh no c chi ph ti u < . Vi mi cnh (i,j) ta c 2 trng hp : Trng hp1: cnh (i,j) l mt cnh ca hnh trnh ti u hay cn c gi l r nhnh gn ( ta quy c ng i trn cnh (i,j) l i-->j ) , nh vy tt c cc ng i t i ra v cc ng i ti j u b loi ra khi ma trn C bng th tc h bc ma trn .V c ng i I --> j th ng i j --> i s b cm .Cng nhu vy nu vic ni cnh (i,j) lm xut hin ng i t 2 nh A n B trong hnh trnh th ng thng ni B n A s b cm. v d :A--->i-->j-->B th cnh (B,A) s b cm ,vic cm cnh (B,A) c gi l cm hnh trnh con . Phng n 2: cnh (i,j) khng thuc hnh trnh ti u , v vy ng i i-->j s b cm ,y l phng n r nhnh xa . Ch thch: Vic cm cnh c thc hin bng cch gn cnh cm c chi ph bng . Trong chng trnh ta u tin chn r nhnh cn v nhnh xa ch thc hin khi chi ph nh nht ln hn cn ca ma trn, khi ta chn cnh (i,j) sao cho khi loi b hng i ct j ra khi ma trn rt gn C th ma trn h bc mi c to thnh c chi ph rt gn ln nht .Ta c th tm c cn tip theo ca ma trn h bc bng cch tm phn t nh nht trn hng i khc phn t c[i,j] v nh nht trn ct j khc phn t c[i,j], khi tng ca 2 phn t nh nht chnh l cn mi ca ma trn rt gn C sau khi loi hng i ct j ra khi ma trn . Qu trnh trn c lp cho ti khi ma trn tr thnh ma trn vung bc 2. Theo quy c trn th bt c cnh no c c[i][j]= th khng tn ti cnh ni I --> j do vy y ta ln lt np vo chu trnh cn thiu 2 cnh cn li c ni vi nhau.Ti y ta so snh cn vi chi ph min - Nu ln hn th b qua. - Nu nh hn th cp nht chi ph min mi, xo b hnh trnh c lu v np hnh trnh mi. - Nu bng th cp nht trng hp v lu thm hnh trnh mi. 3.M ngun: SV: Nguyn Th Qunh Mai Lp 07T1

TH Ton Ri Rc - Cu 1:
#include<stdio.h> #include<conio.h> #define MAX 50 int x[2][MAX]; int n;

Trang 14

void Print() { int i; printf("Thoi gian gia cong chi tiet: \n"); printf("A : "); for(i=0;i<n;i++) printf("%6d",x[0][i]); printf("\nB : "); for(i=0;i<n;i++) printf("%6d",x[1][i]); printf("\n"); } int Read() { int i,j; FILE *f; if((f = fopen("H:\\thoigiangiacong.txt","rt"))==NULL) return 0; fscanf(f,"%d",&n); for(i=0;i<2;i++) for(j=0;j<n;j++) fscanf(f,"%d",&x[i][j]); return 1; } void Swap(int &a,int &b) { int t; t=a; a=b; b=t; } void LapLich() { int A[MAX],B[MAX]; int ia,ib; int ta,tb; int i,j; //Phan nhom ia=0;ib=0; for(i=0;i<n;i++) { if(x[0][i] <= x[1][i]) { A[ia]=i; ia++; } else { B[ib]=i; ib++;

SV: Nguyn Th Qunh Mai

Lp 07T1

TH Ton Ri Rc

Trang 15

} int main() { int s,t; if(Read()==0) { printf("Ko mo duoc file!"); getch(); } Print(); LapLich(); getch(); return 0; } Ma trn u vo: 5 3 4 6 5 3 3 2 7

} } //Sap xep moi nhom for(i=0;i<ia;i++) //A tang dan for(j=i+1;j<ia;j++) { if(x[0][A[i]] > x[0][A[j]]) Swap(A[i],A[j]); } for(i=0;i<ib;i++) //B giam dan for(j=i+1;j<ib;j++) { if(x[1][B[i]] < x[1][B[j]]) Swap(B[i],B[j]); } //Nhap B vao A voi B la lich dc lap j=ia; for(i=0;i<ib;i++) { A[j]=B[i]; j++; } printf("Thu tu chi tiet gia cong nhu sau :\n"); for(i=0;i<n;i++) printf("%d\t",A[i]); //Tinh thoi gian ta=0;tb=0; for(i=0;i<n;i++) { ta+=x[0][A[i]]; if(tb<ta) tb=ta; tb+=x[1][A[i]]; } printf("\nTong thoi gian hao ton la : "); ta<tb ? printf("%d",tb) : printf("%d",ta);

6 3

- Cu 2:
#include<conio.h> #include<math.h>

SV: Nguyn Th Qunh Mai

Lp 07T1

TH Ton Ri Rc

Trang 16

#include<stdio.h> int c[20][20], a[20], xopt[20], chuaxet[20], n, fopt, cmin, can; void nhapdulieu() { int i, j; printf("Nhap so thanh pho: "); scanf("%d", &n); printf("nhap ma tran chi phi c[i][j]\n"); for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) { printf("c[%d][%d]= ", i, j); scanf("%d", &(c[i][j])); } printf("\n MA TRAN CHI PHI BAN DAU LA:\n"); for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) printf("%4d", c[i][j]); printf("\n\n"); } cmin = 0; for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) if ((cmin > c[i][j]) && (i != j)) cmin = c[i][j]; } //===========================// void ghinhan() { int i, sum; sum = (can + c[a[n]][a[1]]); if (sum < fopt) { for (i = 1; i <= n; i++) xopt[i] = a[i]; fopt = sum; } } //============================// void Try(int i) { int j; //co dinh thanh pho xuat phat la thanh pho 1// // duyet (n-1)! hanh trinh theo nhanh can// for (j = 2; j <= n; j++) if (chuaxet[j]) { a[i] = j; chuaxet[j] = 0; can += c[a[i - 1]][a[i]]; if (i == n) ghinhan(); else if (can + (n - i + 1) * cmin < fopt) Try(i + 1); can -= c[a[i - 1]][a[i]]; chuaxet[j] = 1; } } //==============================// void ketqua() { int i, j; printf("\nhanh trinh toi uu co chi phi la :%5d \n\n", fopt); for (i = 1; i <= n; i++) printf("%2d--->", xopt[i]); printf("%2d", xopt[1]); } //===============================//

SV: Nguyn Th Qunh Mai

Lp 07T1

TH Ton Ri Rc

Trang 17

void init() { int i, j; cmin = 0; for (i = 1; i <= n; i++) { chuaxet[i] = 1; for (j = 1; j <= n; j++) if ((i != j) && (cmin > c[i][j])) cmin = c[i][j]; } fopt = 32767; //gia su fopt ban dau lay gia tri lon nhat maxint trong pascan// can = 0; a[1] = 1; } void main() { clrscr(); nhapdulieu(); init(); Try(2); ketqua(); getch(); }

4.Demo: - Cu 1:

- Cu 2:

SV: Nguyn Th Qunh Mai

Lp 07T1

TH Ton Ri Rc

Trang 18

III. BI 3: BI TON TRN TH 1. bi: Vit chng trnh pht sinh ngu nhin ma trn trng s Anxn=(aij)nxn ca th v hng lin thng G gm n nh (aij=aji i,j=1..n). a) Kim tra th G c phi l th Euler hay khng. b) Nhp hai nh x,y v dng thut ton Dijkstra tm ng i ngn nht t x n y. c) Dng thut ton Prim tm cy ph nh nht ca th G. 2.Thut ton: - To ma trn: s dng b ngu nhin khi to gi tr cho ma trn ca th G. - Chuyn ma trn v dng c a[i][i] v cc cnh khng c ng i bng . - Kim tra th Euler: tt c cc nh ca th phi c bc chn. - Thut ton Dijkstra: + u vo: th c hng G=(V,E) vi n nh, x V l nh xut pht, y l nh ch, a[u,v], u,v V l ma trn trng s. + u ra: khong cch t x y. + Truoc[v] ghi nhn nh i trc v trong ng i ngn nht t x v + Bc 1: Khi to: d[v]=a[x,v]; Truoc[v]=x; d[x]=0; T=V\{x}, T l tp cc nh c nhn tm thi. + Bc 2: Lp While T : - Tm nh u tha mn d[u] = min{d[z], z T}; - T = T\{u} //C nh nhn ca nh u. SV: Nguyn Th Qunh Mai Lp 07T1

TH Ton Ri Rc

Trang 19

- for v T: //Gn nhn li cho cc nh trong T if(d[v] > d[u] +a[u,v]){ d[v] = d[u] +a[u,v]; Truoc[v] = u; } - Cy ph Prim: Bc 1: Xut pht t nh k bt k (thng thng chn nh u tin) chn mt cnh c trng s nh nht lin k vi nh k (min{A[k] [j]}j=1..n) ta nh du 2 nh i qua cnh v s cnh tm c l 1. Chuyn sang bc 2. Bc 2: Tm cnh nh nht ca th vi iu kin cnh tm c phi c 1 nh cha nh du v 1 nh nh du (min{A[i][j]}j=1..n, i=1..n sao cho i nh u v j cha nh du) trnh trng hp to thnh chu trnh. Ta tng s cnh tm c ln 1 v chuyn sang bc 3. Bc 3: Nu s cnh tm c bng n-1 kt thc thut ton, ngc li quay v bc 2. Ta t chc mng 1 chiu D nh du . Nu D[i]=1 nh i c nh du v D[i]=0 nu i cha c nh du. - Tm min{A[1][j]}j=1..n. Sau gn D[1]=D[j]=1 (nh du 2 nh 1,j) v cho s cnh tm c bng 1 (Dem=1). - Tm min{A[i][j]}j=1..n, i=1..n vi iu kin D[i]=1 v D[j]=0. Sau gn D[j]=1 (nh du nh j va tm c) v tng s cnh ln 1 (Dem++). - Nu Dem = n-1 th thut ton kt thc. 3.M ngun:
#include<math.h> #include<string.h> #define vc 32767 #include<stdio.h> #include<conio.h> #include<stdlib.h> int i, j, n, x, y; int c[20][20], tr[20], s[20], chuaxet[20]; void khoitao(); void inra1(); void euler(); void xtoy(); void cayphu(); void taomang(); void ngaunhien(); //====================// void main() {

SV: Nguyn Th Qunh Mai

Lp 07T1

TH Ton Ri Rc

Trang 20

clrscr(); n = 0; taomang(); if (n != 0) { printf("\tMa tran sinh ra la:\n"); inra1(); khoitao(); euler(); printf("\tNhap vao dinh suat phat X="); scanf("%d", &x); printf("\tNhap vao dinh dich Y="); scanf("%d", &y); xtoy(); cayphu(); } getch(); } void taomang() { printf("\tnhap n="); scanf("%d", &n); randomize(); for (i = 1; i <= n; i++) { c[i][i] = 0; for (j = i + 1; j <= n; j++) c[i][j] = c[j][i] = random(99); } } void khoitao() { for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) if (c[i][j] == 0) c[i][j] = vc; for (i = 1; i <= n; i++) tr[i] = chuaxet[i] = 0; for (i = 1; i <= n; i++) s[i] = vc; } void inra1() { for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) printf("%5d", c[i][j]); printf("\n"); } } void euler() { int bac, kt = 1; for (i = 1; i <= n; i++) { bac = 0; for (j = 1; j <= n; j++) if (c[i][j] != vc) bac++; if (((bac % 2) == 1) || (bac == 0)) kt = 0; } if (kt == 1) printf("\n\tDo thi tren la do thi Euler\n"); else

SV: Nguyn Th Qunh Mai

Lp 07T1

TH Ton Ri Rc

Trang 21

printf("\n\tDo thi tren khong phai la do thi Euler\n"); } void xtoy() { int kt, k, b[20]; chuaxet[y] = 1; s[y] = 0; tr[y] = 0; do { kt = 0; for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) if ((chuaxet[j] == 1) && (c[i][j] != vc)) { if ((s[j] + c[i][j]) < s[i]) { s[i] = s[j] + c[i][j]; tr[i] = j; chuaxet[i] = 1; kt = 1; } } } while (kt == 1); if (s[x] != vc) { b[1] = x; k = 1; while (tr[b[k]] != 0) { k++; b[k] = tr[b[k - 1]]; } printf("\tDuong di ngan nhat tu dinh %d --> %d la:\n\t\t", x, y); for (i = 1; i < k; i++) printf("%d -->", b[i]); printf("%d\n", b[k]); printf("\t\tDo dai doan duong la:%d", s[x]); } else { printf("\tKhong ton tai duong di tu dinh %d --> %d \n", x, y); } } void cayphu() { int p = 1, g[20][2], k, h, dodai, kt, min, u, cl; for (i = 1; i <= n; i++) chuaxet[i] = 0; chuaxet[p] = 1; k = 1; for (i = 1; i <= n; i++) if (p != i) { s[i] = c[p][i]; tr[i] = p; } kt = 0; h = 0; cl = 0; while ((kt == 0) && (cl == 0)) { min = vc; for (i = 1; i <= n; i++) if ((chuaxet[i] == 0) && (s[i] <= min)) { min = s[i];

SV: Nguyn Th Qunh Mai

Lp 07T1

TH Ton Ri Rc
} u = i;

Trang 22

} }

k++; chuaxet[u] = 1; h++; g[h][1] = tr[u]; g[h][2] = u; if (c[u][tr[u]] == vc) cl = 1; if (k == n) { printf("\n\tCay khung nho nhat tim thay:"); if (cl == 0) { kt = 1; dodai = 0; printf("\n\t\t"); for (i = 1; i < h; i++) { printf("(%d,%d);", g[i][1], g[i][2]); dodai += c[g[i][1]][g[i][2]]; } printf("(%d,%d)\n", g[h][1], g[h][2]); dodai += c[g[h][1]][g[h][2]]; printf("\t\tDo dai cay khung: %d", dodai); } else { printf("\n\t"); for (i = 1; i <= 30; i++) printf("*"); printf("\n"); printf("\t* Khong the tim duoc cay phu *"); printf("\n\t"); for (i = 1; i <= 30; i++) printf("*"); printf("\n"); } } else { for (i = 1; i <= n; i++) if ((chuaxet[i] == 0) && (c[u][i] < s[i])) { s[i] = c[u][i]; tr[i] = u; } }

4.Demo:

SV: Nguyn Th Qunh Mai

Lp 07T1

TH Ton Ri Rc

Trang 23

SV: Nguyn Th Qunh Mai

Lp 07T1

You might also like