Referat
Lucrarea de laborator Nr 4,5
Tema: Algoritmul de cutare a grafului de acoperire i
a drumului minim ntr-un graf
A efectuat:
A verificat:
lectorul Ceban G.
Chiinu 2004
Scopul lucrrii:
Enunul problemei:
1. S se elaboreze procedura introducerii unui graf ponderat;
2. S se elaboreze procedura determinrii drumului minim.
3. S se elaboreze programul procedurii de determinare a grafului
de acoperire cu posibiliti de pornire a procedurii din oricare
vrf al grafului
Textul programului :
Algoritmul de Cutare a grafului de acoperire:
#include<stdio.h>
#include<conio.h>
#define MAX_ARCURI 50
#define MAX_VARFURI 20
struct Elem {
int N;
struct Elem * P;
};
typedef Elem* ElemPtr;
typedef int MAdiacenta[MAX_VARFURI] [MAX_VARFURI];
typedef int MIncidenta[MAX_ARCURI] [MAX_VARFURI];
int cd[MAX_VARFURI];
int i;
int all; // variabila va contine numarul de noduri din graf
ElemPtr Pt; // pointer, va fi folosit pentru a accesa elementele listei de adiacenta
MAdiacenta MA;
MIncidenta MI;
ElemPtr T[MAX_VARFURI]; // declararea listei de adiacenta
// initializarea listei de adiacenta
void InitListAdiacenta(void)
// functia data este folosita pentru initializarea listei
{
int i;
for (i=0; i<MAX_VARFURI; i++)
while (T[i]->N !=0)
{
Pt=T[i];
T[i]=Pt->P;
delete Pt;
}
}
for (i=0;i<all;i++)
{
Pt=T[i];
//pregatirea pentru a misca prin lista
for (i1=0;i1<all;i1++)
{
if (MA[i][i1]!=0)
{
Pt->N=i1+1; // settarea valorii nodului current
Pt->P = new Elem;
// alocarea memorie pentru un nou element al listei
Pt=Pt->P; // avansarea
Pt->N=0; //settarea sfarsitului
}
}
}
}
// introducerea matricei de incidenta
void InMI(void)
{
int AllLink;
int i,i1; // variabile contor
int Sr,Tg;
printf("Introducerea matricei de incidenta \n");
printf("Numarul de arcuri : ");
scanf("%d",&AllLink); // citirea numarului de arcuri
printf("\nNumarul de varfuri : ");
scanf("%d",&all); //citirea numarului de varfuri
for (i=0;i<all;i++)
for (i1=0;i1<AllLink;i1++)
{
printf("\nVarful %d si arcul %d ",i+1,i1+1);
scanf("%d",&MI[i][i1]); //citirea elementului dat
}
InitListAdiacenta(); //curatarea listei de adiacenta
for (i=0;i<AllLink;i++)
{
Sr=0; Tg=0;
for (i1=0;i1<all;i1++)
{
if (MI[i1][i]==1) Tg=i1;
//nodul - i1 este destinatia arcului
if (MI[i1][i]==-1) Sr=i1; //nodul - i1 este sursa arcului
}
if (Sr != 0)
{
Pt=T[Sr];
//adaugam nodul pentru elementul sursa
while (Pt->N != 0)
{
if (Pt->N==Tg) goto label1;
Pt= Pt->P;
}
Pt->N=Tg; //adaugarea nodului
Pt->P = new Elem; //alocarea memoriei
Pt->P->N=0; //setarea sfarsitului listei de noduri
label1:
;
}
}
}
char t[MAX_VARFURI];
void initT(void)
{
for (int i=0;i<MAX_VARFURI;i++) t[i]=0;
}
MAdiacenta a;
void createMA()
{
int i,i1;
for (i=0;i<MAX_VARFURI;i++) //curatarea matricei
for (i1=0;i1<MAX_VARFURI;i1++) a[i][i1]=0;
for (i=0;i<all;i++) //pentru toate varfurile
{
Pt=T[i]; //setam pointerul de parcurgere
while (Pt->N != 0) //pana nu s-a ajuns la sfarsit
{
if (a[i][Pt->N-1]==0) a[i][Pt->N-1]=1;
//crearea matricei
Pt=Pt->P; //avansarea in lista
}
}
}
MAdiacenta b;
void parcinadinc(int k) // parcurgerea in adancime
{
int i;
t[k]=1;
for (i=0;i<all;i++)
if ((a[k][i]==1) && (t[i]==0))
{
b[k][i]=1;
parcinadinc(i);
}
}
void grafacoperire()
{
int i,j;
for (i=0;i<all;i++)
for (j=0;j<all;j++) b[i][j]=0;
createMA();
initT();
parcinadinc(0);
}
printf("Succesiunea de virfuri este:\n");
for(i=0;i<t;i++)
{printf("X[%d]",D[0][i]);if(i<t-1)printf(" > ");}
printf("\n");
getche();exit(n);
}
void Ford(int n)
{int H[20],i,j,ad[20][20];
int dr[10],l;clrscr();
printf("Introdu matricea de adiacenta:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)scanf("%d",&ad[i][j]);
printf("Pina in ce virf doriti sa aflati drumul minim?\n");
scanf("%d",&l);
H[0]=0;
for(i=1;i<n;i++)
H[i]=d;
for(i=0;i<n-1;i++)
for(j=1;j<n;j++)
if((j!=i)&&(ad[i][j]!=0))
{if(H[j]-H[i]>ad[i][j])H[j]=H[i]+ad[i][j];}
for(i=0;i<n;i++)printf(" %d ",H[i]);dr[0]=l;i=1;
printf("\nDrumul minim din virful 1 pina in virful %d este:%d\n",l,H[l-1]);
printf("Succesiunea de drumuri este:\n");
A1:for(j=n-1;j>=0;j--)
if((j!=l-1)&&(ad[j][l-1]!=0))
{if(H[l-1]-H[j]==ad[j][l-1])
{dr[i]=j+1;i++;l=j+1;if(l>0)goto A1;else goto A2;}
}
A2: for(j=i-1;j>=0;j--)
{printf("X[%d]",dr[j]);if(j>0)printf(">");}
getche();exit(n);
}
Rezultatele Obinute:
Drumul Minim: