void descompun_drum(int i,int j) //realizeaza descompunerea portiunii de la i la j prin k {int g=0,k=1; while(k<=n&&!g) {if(i!=k&&j!=k) if(a[i][j]==a[i][k]+a[k][j]) {descompun_drum(i,k); descompun_drum(k,j); g=1;} //g marcheaza daca se poate realiza descompune rea k++; } if(!g) cout<<j<<" "; //cand drumul nu mai poate fi descompus afisez extremitatea f inala
}
void scriu_drum(int nodini,int nodfin) // functia primeste ca parametri cele dou a noduri pt care se determina optimul {if(a[nodini][nodfin]<pinf) {cout<<"lantul de la "<<nodini<<" la "<<nodfin<<" are lungimea "<<a[nodini] [nodfin]; cout<<endl<<"un drum optim este: "<<endl; cout<<nodini<<" "; descompun_drum(nodini,nodfin); // apeleaza functia care afiseaza efectiv l antul } else cout<<"nu exista drum de la "<<nodini<<" la "<<nodfin; }
void main() {clrscr();int x,y; citire_cost(); cout<<endl<<"matricea ponderilor "<<endl; afisare_mat(); genarare_matrice_drumuri_optime(); cout<<endl<<"matricea drumurilor optime "<<endl; afisare_mat(); cout<<endl<<"Se determina drumul minim intre varfurile x si y "<<endl; cout<<"x="; cin>>x; cout<<"y="; cin>>y; scriu_drum(x,y); getch(); } roy bun Cod sursa C/C++ #include<stdio.h> #include<conio.h> #define pinf 10000 //pentru plus infinit, o valoare mare care nu exista int a[20][20],n,m; void citire_cost() { FILE *f; int i,j,x,y,c; f= fopen("roy_in.txt","rt"); if(f) printf("deschiderea a reusit"); else printf("eroare la deschidere!"); printf("\n"); fscanf(f,"%d",&n); fscanf(f,"%d\n",&m); //initializare matrice for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==j) a[i][j]=0; else a[i][j]=pinf; for(i=1;i<=m;i++) {fscanf(f,"%d %d %d\n",&x,&y,&c); a[x][y]=a[y][x]=c;} fclose(f); } void afisare_mat() {for(int i=1;i<=n;i++) {for(int j=1;j<=n;j++) if(a[i][j]==pinf) printf(" - "); else printf("%4d ",a[i][j]); printf("\n"); } } void RoyFloyd() // roy floyd {for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(a[i][j]>a[i][k]+a[k][j]) { a[i][j]=a[i][k]+a[k][j]; } } void descompun_drum(int i,int j) //realizeaza descompunerea portiunii de la i la j prin k {int ok=0,k=1; while(k<=n&&!ok) { if(i!=k&&j!=k) if(a[i][j]==a[i][k]+a[k][j]) { descompun_drum(i,k); descompun_drum(k,j); ok=1;} //g marcheaza daca se poate realiza descompunerea k++; } if(!ok) { printf(" %d ",j); }//cand drumul nu mai poate fi descompus afisez extremitatea finala } void scriu_drum(int nod_initial,int nod_final) // functia primeste ca parametri cele doua noduri pt care se determina optimul {if(a[nod_initial][nod_final]<pinf) { printf("lantul de la %d la %d are lungimea %d ",nod_initial,nod_final,a[nod_initial][nod_final]); printf("\n un drum optim este: %d ",nod_initial); descompun_drum(nod_initial,nod_final); // apeleaza functia care afiseaza efectiv lantul } else printf("nu exista lant de la %d la %d ",nod_initial,nod_final); } void main() { int x,y; citire_cost(); printf("\nmatricea ponderilor \n"); afisare_mat(); RoyFloyd(); printf("\n matricea drumurilor optime \n"); afisare_mat(); printf("\n Se determina drumul minim intre varfurile x si y \n"); printf("x="); scanf("%d",&x); printf("y="); scanf("%d",&y); scriu_drum(x,y); _getch(); } Fisierul Roy_in.txt este de forma 5 5 // numarul de noduri si numarul de muchi 1 2 2 // intre nodul 1 si 2 exista muchia de cost 2 2 3 3 // intre nodul 2 si 3 exista muchia de cost 3 3 4 1 3 5 8 4 1 10 Dijkstra void citire(int a[30][30], int*n) { int i,j; printf("n="); scanf("%i", n); for (i = 0; i<*n; i++) {for(j = i+1; j<*n; j++) { printf("a[%d][%d]=", i+1,j+1); scanf("%i",&a[i][j]); a[j][i]=a[i][j]; } a[i][j]=0; }} void afis_drum(int I, int t[]) { i(t[i]!=0) afis_drum(t[i],t); printf(%d", i+1); } int main(int argc, char*argv[]) { int a[30][30]; int s[30], t[30], d[30]; int n, I, j, r, min, poz; citire(a,&n); printf("nodul de pornire="); scanf("%i",&r); r--; for (i=0; i<n; i++) {s[i] =0; t[i]=0;} s[r] = 1; for(i=0; i<n; i++) {d[i]=a[r][i]; if (i!=r) if(d[i]<3000) t[i]=r; } for(i=0; i<n-1; i++) { min = 30000; for(j=0; j<n; j++) if (s[j] ==0) if ( d[j]< min) {min = d[j]; poz = j; } s[poz] = 1; for(j=0; j<n; j++) if (s[j] == 0) if (d[j] < min ) { min = d[j]; poz = j; } s[poz] = 1; for(j=0; j<n; j++) if s[j] = = if ( d[j]>d[poz]+a[poz][j] ) d[j] = d[poz] + a[poz][i]; t[j] = poz; }} for (i=0; i<n; i++) if ( r!= i) {printf ("\ndistanta de la nodul %d la nodul %i este %d pe drumul: \n", r+1, i+1, d[i]); afis_drum(I,t); } getch(); return 0; }
Roy-Foyd Fie F un graf neorientat, dat prin matricea costurilor. Se cere ca pentru fiecare pereche de varfuri (i,j) sa se tipareasca lungimea drumului mi nim de la i la j. void citire( int a[30][30], int *n) { int i,j; printf("n="); scanf("&i", n); for ( i=0; i<*n; i++) { for (j=0; j<*n; j++) if (i!=j) { printf("a[%d][%d]=", i+1, j+1); scanf("%i", &a[i][j]); } a[i][j] = 0;}} void afisare (float a[][30], int m, int n) { printf("\n"); for (int j =0; j<n; j++) printf("3.1f", a[i][j]);}} int main (int arcv, char *argv[]) { int a[30][30]; int sol[30]; int n, i, j, k; citire (a, &n); for (k=0; k<n; k++) for (i=0; i<n; i++) if (a[i][j] > a[i][k] + a[k][j]) a[i][j] = a[i][k] + a[k][j]; afisare(a,n,n); getch(); return 0; } Cuvant in fraza Sa se un cuvant dat intr-o fraza. int da(char*pm, char*pp) { char *i; if (strlen (pm==0)) return 1; else { i =strchr(pp, pm[0]); if (i==NULL) return 0; else return da(pm+1, i+1); }} void main() { char m[10], p[40]; printf("Cuvantul de cautat: "); gets(m); printf("\nFraza: "); gets(p); if (da(n,p)) printf("Este in fraza"); else printf("Nu este in fraza"); getch(); } Multime 1,3,4 int apartine( int el, int v[], int n) { for (int i=0; i<n; i++) if (v[i] == el) return 1; return 0; } void afisare( int v[], int n) { printf("/n"); for (int i=0; i<n; i++) printf("%i", v[i]);} void main () { int m[100], y, z, i=1; j=0; m[0] = 1; while (i<1000) { y = 2*m[j]+1; if(!(apartine(y,m,i))) { m[i] = y; i++; } z = 3*m[j]+1; if (!(apartine(z,m,i))) { m[i] = z; i++; } j++;} afisare(m,i);} numarul 4 void patru_it( int n) { int k =-1, a[200]; while (n!4) { switch (n%10) { case 0: a[++k] = 0; n/=10; break; case 4: a[++k] = 4; n/=10; break; default: a[++k] = 2; n*-2; break; } } cout<<"\n4"; for(int i=k; i>=0; i--) switch (a[i]) { case 0: n*=10; cout<<"->"<<n; break; case 4: n=n*10+4; cout<<"->"<<n; break; default: n/=2; cout<<"->"<<n; break; }
void patru_rec (int n) { if (n-4) { switch (n%10) {case 0: patru_rec (n/10); break; case4: patru_rec (n/10); break; default: patru_rec (n*2);) cout<<"->"<<n;}} void main () { int n; cout<<endl<<"n= "; cin>>n; patru_it(n); cout<<endl<<"recursiv "; patru_rec(n); } Problema lui Hamming procedure ConstMult(n,A) { integer a, a2, a3, a5, i,j,k,m, A(n); a=1; a2=2; i=1; a3=3; j=1; a5=5; k=1; while (a<=n) if (a2< a3) if (a2 < a5) a = a2; else a = a5; else if a3<= a5 a = a3; else a = a5; if a<= n then m = m+1; A(m) = a; if a2=a then i = i +1; a2 = 2*A(i); if a3=a then j = j+1; a3 = 3*A(j); if a5 = a then k = k+1; a5 = 5*A(k); return; end;