You are on page 1of 4

Roy-Floyd

#include<fstream.h>
int a[100][100],n;
int const MAX=5000;
fstream f(cost.txt,ios::in);
void init()
{int i,j; f>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j) a[i][j]=0; else a[i][j]=MAX;}
void citire()
{int i,j,c;
while(f>>i>>j>>c) a[i][j]=c; f.close();}
void transformare()
{for(int k=1; k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][k]+a[k][j]<a[i][j])
a[i][j]=a[i][k]+a[k][j];}
void afisare()
{cout<<costul drumurilor minime intre nodurile:<<endl;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][j]<MAX && i!=j)
cout<<(<<i<<,<<j<<)-<<a[i][j]<<endl;)
void main()
{init();citire(); transformare(); afisare();}
Dijkstra
# include<fstream.h>
int a[100][100],n,d[100],s[100],p[100];
int const MAX=5000;
fstream f(cost.txt,ios::in);
void init()
{int i,j; f>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j) a[i][j]=0; else a[i][j]=MAX;}
void citire()
{int i,j,c;
while(f>>i>>j>>c) a[i][j]=c; f.close();}
void generare_drum(int x)
{int i,j,min,y; s[x]=1;
for(i=1;i<=n;i++)
{d[i]=a[x][i];
if(i!=x && d[i]<MAX) p[i]=x;}
for(i=1;i<=n-1;i++)
{for(j=1,min=MAX;j<=n;j++)
if(s[j]==0 && d[j]<min)
{min=d[j];y=j;}
s[y]=1;
for(j=1;j<=n;j++)
if(s[j]==0 && d[j]>d[y]+a[y][j])
{d[j]=d[y]+a[y][j]; p[j]=y;}}}
void drum(int i)
{if(p[i]!=0) drum(p[i]);

cout<<i<< ;}
void afisare(int x)
{for(int i=1;i<=n;i++)
if(i!=x)
if(p[i]!=0)
{cout<<drumul cu costul minim de la nodul <<x;
cut<<la nodul<<i<< are costul<<d[i]<<endl;
drum(i); cout<<endl;}
else cout<<nu exista drum; }
void main()
{int x; cout<<x=;cin>>x; init();
citire(); generare_drum(); afisare();}
Hamiltonian
#include<fstream.h>
typedef stiva[100];
int a[20][20],n,k,as,ev,este=0;
stiva st;
fstream f(graf.txt,ios::in);
void citeste()
{//se cit matr de ad din fisier}
void init() {st[k]=0;}
int succesor()
{if(st[k]<n) {st[k]=st[k]+1; return 1;} else return 0;}
int valid()
{ if(k>1&& a[st[k-1]][st[k]]==0) return 0;
for(int i=1;i<k;i++)
if(st[k]==st[i]) return 0;
return 1; }
int solutie() {return a[st[k]][1]==1&&k==n;}
void tipar()
{for(int i=1,este=1;i<=n;i++)
cout<<st[i]<<, ; cout<<st[1]<<endl;}
void bt()
{k=2; init();
while(k>1)
{ as=1;ev=0;
while(as && !ev)
{ as=succesor();
if(as) ev=valid(); }
if(as)
if(solutie()) tipar();
else {k++; init();}
else k--;
}}
void main()
{citeste(); st[1]=1 ; bt() ;
if(!este)cout<<graful nu e Hamiltonian;}

Eulerian
#include<fstream.h>
typedef stiva[20];
int n,a[20][20], vizitat[20], vf,k,m,g[20],p=1;c[20],c1[20];
stiva st;

fstream f(graf.txt,ios::in);
void citeste() {//se cit graf din fisier}
void init(int i)
{vf=1;st[vf]=i;vizitat[i]=1;}
int este_vida() {return vf==0;}
void adaug(int i)
{vf++; st[vf]=i; vizitat[i[=1;}
void elimina() {vf--;}
void prelucrare()
{int i=1; k=st[vf];
while(i<=n && (a[i][k]==0 || (a[i][k]==1 && vizitat[i]==1))) i++;
if(i==n+1) elimina(); else {p++;adaug(i);}}
int conex()
{k=1;init(k);
while(!este_vida()) prelucrare();
return (p==n)}
void grad()
{for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][j]==1) {g[i]++;m++}
m=m/2;}
int izolat()
{for(int i=1;i<=n;i++)
if(g[i]==0) return 1;
return 0;}
int grad_par()
{for(int i=1;i<=n;i++)
if(g[i]%2==1) return 0;
return 1;}
void ciclu()
{int i,j,k=1,p,q,gasit;
c[1]=1;
do for(j=1,gasit=0;j<=n&&!gasit;j++)
if(a[c[k]][j]==1)
{k=k+1;c[k]=j;
a[c[k-1]][j]=0;a[j][c[k-1]]=0;
g[j]--;g[c[k-1]]--;gasit=1;}
while(c[k]!=1);
while(k-1<m)
{for(i=1,q=0;i<=k-1&&q==0;i++)
if(g[c[i]]>0) {c1[1]=c[i],q=i;}
p=1;
do for(j=1,gasit=0;j<=n&&!gasit;j++)
if(a[c1[p]][j]==1)
{p=p+1;c1[p]=j;a[c1[p-1]][j]=0;a[j][c1[p-1]]=0;
g[j]--;g[c1[p-1]]--;gasit=1;}
while(c1[p]!=c1[1]);
for(j=k;j>=q;j--) c[j+p-1]=c[j];
for(j=1;j<=p-1;j++) c[j+q]=c1[j+1];
k=k+p-1}}
void main()
{int eulerian(); citeste(); grad();
eulerian=!(izolat())&&grad_par()&&conex();
if(!eulerian) cout<<graful nu este eulerian;
else {cout<<graful este eulerian<<endl;
ciclu(); cout<<ciclul eulerian este;

for(int i=1;i<=m+1;i++)
cout<<c[i]<< ;}}

You might also like