Sie sind auf Seite 1von 6

/**se citesc di fisier n noduri si m } viz[i]=nr;

perechei de muchii g<<nr<<" componente conexe"; for(int j=1; j<=n; j++)


sa se afiseze g<<endl; if(a[i][j]&&!viz[j])
a) cate comp conexe are graful for(i=1; i<=nr; i++) df(j,nr);
dat { }
b) nr componentei conexe cu nr s=0; int main()
maxim de noduri for(j=1; j<=n; j++) {
c) nr minim de muchii ce trebuie if(viz[j]==i) citire();
adaugate a i graful sa devina s++; int nr=0,i,k=0;
conex if(s>smax) for(int i=1; i<=n; i++)
d) nodurile care fac parte din { if(!viz[i])
componenta conexa cu nr max smax=s; {
de noduri imax=i; nr++;
e) citindu se de la tastatura 2 }} df(i,nr);
noduri sa se afiseze daca cele 2 g<<imax; }
noduri fac parte din aceeasi g<<endl; for(i=1; i<=n; i++)
compomnenta conexa g<<nr-1; if(d[i]==0)
**/ g<<endl; k++;
for(i=1; i<=n; i++) g<<nr-k<<"zone
#include <iostream> if(viz[i]==imax) separate"<<endl;
#include <fstream> g<<i<<" "; for(i=1; i<=nr; i++)
using namespace std; f>>p>>q; {
ifstream f("date.in"); if(viz[p]==viz[q]) g<<"zona"<<i<<":";
ofstream g("date.out"); g<<"da"; for(int j=1; j<=n; j++)
int else g<<"nu"; if(viz[j]==i)
i,j,a[100][100],nr,n,m,viz[100],s,s } g<<j<<" ";
max,imax,p,q; g<<endl;
void citire() problema 943 }
{ subpunctele a,b,c for(i=1; i<=nr; i++)
f>>n>>m; {
for(int x=1; x<=m; x++) #include <fstream> g<<"zona "<< i<<":";
{ #include <cstdlib> int ok=0;
f>>i>>j; using namespace std; for(j=1; j<=n; j++)
a[i][j]=a[j][i]=1; ifstream f ("date.in"); for(k=j+1; k<=n; k++)
} ofstream g ("date.out");
} int if(a[j][k]==1&&viz[j]==i&&viz[k
void DF(int i,int nr) a[100][100],viz[100],i,j,k,n,m,d[10 ]==i)
{ 0]; {
viz[i]=nr; void citire() g<<j<<"-"<<k<<endl;
for(int j=1; j<=n; j++) { ok=1;
if(a[i][j]&&!viz[j]) f>>n>>m; }
DF(j,nr); for(int x=1; x<=m; x++) if(ok==0)
} { g<<" nu contine trasee";
int main() f>>i>>j; }
{ a[i][j]=a[j][i]=1; return 0;
citire(); d[i]++; }
int nr=0; d[j]++;
for(i=1; i<=n; i++) }
if(!viz[i])
{ }
nr++; void df(int i,int nr)
DF(i,nr); {
Generarea lanturilor din matrice citire(); ok=0;
#include <iostream> for(x=1; x<=n; x++) for(i=1; i<=n; i++)
#include <fstream> for(y=1; y<=n; y++) if(d[i]%2==1)
using namespace std; if(x!=y) ok=0;
ifstream f("date.in"); { if(ok)
ofstream g("date.out"); ok=0; g<<"este eulerian";
int st[1]=x; else
m,n,a[100][100],viz[100],nr,i,j,c,st backk(2); g<<"nu este";
[100],z,maxi,k,y,x,ok; if(ok==0)
void citire() g<<"nu ex lant intre return 0;
{ "<<x<<" si "<<y; }
int i,j,x; g<<endl; //Sa se verifice daca un graf e
f>>n>>m; } hamiltonian
for(x=1; x<=m; x++) }
{ Sa se verifice daca un graf este #include <fstream>
f>>i>>j; eulerian. using namespace std;
a[i][j]=a[j][i]=1; #include <iostream> ifstream f("date.in");
} #include <fstream> ofstream g("date.out");
} using namespace std; int
int valid(int k) ifstream f("date.in"); n,m,a[100][100],st[100],ok,x,y,d[1
{ ofstream g("date.out"); 00];
if(k>1) int int valid(int k)
if(a[st[k-1]][st[k]]==0) viz[100],a[100][100],m,n,st[100],r, {
return 0; nr,c,ok1,ok2,t[100],i,ok,j,d[101]; if(k>n)
for(i=1; i<k; i++) void citire() return 0;
if(st[k]==st[i]) { for(int i=1; i<=k-1; i++)
return 0; int l,i,j; if(st[k]==st[i])
return 1; f>>n>>m; return 0;
} for(int x=1; x<=m; x++) if(k>1 && a[st[k]][st[k-1]]==0)
void tipar(int k) { return 0;
{ f>>i>>j; return 1;
int i; a[i][j]=a[j][i]=1; }
ok=1; d[i]++;
for(i=1; i<=k; i++) d[j]++; int solutie(int k)
g<<st[i]<<" "; {
g<<endl; } int i;
} } if(k<=2)
void backk(int k) void df(int i,int nr) return 0;
{ { if(a[st[k]][st[1]]==0)
int i; viz[i]=nr; return 0;
for(i=1; i<=n; i++) for(int j=1; j<=n; j++) return 1;
{ if(a[i][j]==1 && viz[j]==0) }
st[k]=i; df(j,nr);
if(valid(k)) } void tipar(int k)
if(st[k]==y) int main() {
tipar(k); { ok=1;
else backk(k+1); citire(); }
for(i=1; i<=n; i++)
} if(viz[i]==0) void BAC(int k)
} df(i,++nr); {
int main() ok=1; for(int i=1; i<=n; i++)
{ if(nr>1) {
st[k]=i; 12 {
if(valid(k)) viz[i]=nr;
{ 17 for(int j=1; j<=n; j++)
if(solutie(k)) 46 if(a[i][j]==1 && viz[j]==0)
tipar(k); df(j,nr);
BAC(k+1); x=3 p=3 }
} L= 3 int main()
} secventa {
} este : 3 1 citire();
2 for(int i=1; i<=n; i++)
int main() if(d[i]==0)
{ g<<i<<" ";
f>>n>>m; f>>x>>p;
5. Sa se determine intr-un graf
for(int i=1; i<=m; i++) f>>j;
neorientat componenta conexa
{ ok=1;
din care face parte nodul x, x
f>>x>>y; while(f>>x1)
citit.
a[x][y]=a[y][x]=1; {
++d[x], ++d[y]; Date in if(a[x1][j]!=1)
} ok=0;
BAC(1); 74 j=x1;
if(ok) 13 }
g<<"hamiltonian"; 12 if(ok==1)
else 17 g<<"DA";
g<<"nu e hamiltonian"; 46 else g<<"NU";
3 f>>z;
return 0; 3 for(i=1; i<=n; i++)
} 312 if(viz[z]==viz[i])
4. In fisierul graf.in sunt 2 g<<i<<" ";
introduse datele referitoare la Date out 5 NU1 2 3 4 5 6 7 g<<endl;
un graf neorientat : #include <iostream>
#include <fstream> return 0;
-pe prima linie
using namespace std; }
numarul de
varfuri si muchii ifstream f("date.in"); PROBLEMA 3
(n, m) ofstream g("date.out"); 1. Intre n localitati
- pe urmatoarele int (numerotate cu valori
m linii perechi de x1,p,x,viz[100],a[100][100],m,z, de la 1 la n) sunt
numere n,st[100],r,nr,c,ok1,ok2,t[100],i, instalate legaturi
reprezentand ok,j,d[101]; telefonice. Se cunosc
muchiile grafului perechile de localitati
void citire()
a. Afisati lista nodurilor izolate intre care exista
{
legatura prin fir direct.
b. Se introduce de la tastatura o int l,i,j; Scrieti un program
secventa de L varfuri. Sa se f>>n>>m; care:
verifice daca respectiva for(int x=1; x<=m; x++) a. Calculeaza si afiseaza
secventa este un lant elementar { cu cate localitati se
care porneste din varful x. f>>i>>j; poate comunica direct
a[i][j]=a[j][i]=1; din localitatea X
Exemplu : d[i]++; b. Calculeaza si afiseaza
d[j]++; cu cate localitati se
Graf.in poate comunica din
74 a. 5 } localitatea X, direct sau
b. Da } indirect
13 c. Afiseaza localitatile intre
void df(int i,int nr)
care exista legatura, pe
grupuri care nu a[i][j]=a[j][i]=1; f>>n>>m;
comunica intre ele. d[i]++; for(int x=1; x<=m; x++)
d. Stabileste daca intre d[j]++; {
doua localitati date se f>>i>>j;
poate realiza o legatura } a[i][j]=a[j][i]=1;
telefonica. } d[i]++;
Datele de intrare se gasesc in void df(int i,int nr) d[j]++;
fisierul graf.in astfel {
viz[i]=nr; }
- pe prima linie for(int j=1; j<=n; j++) }
numarul de if(a[i][j]==1 && viz[j]==0) void df(int i,int nr)
varfuri si muchii df(j,nr); {
(n, m) } viz[i]=nr;
- pe urmatoarele int main() for(int j=1; j<=n; j++)
m linii perechi de { if(a[i][j]==1 && viz[j]==0)
numere citire(); df(j,nr);
reprezentand f>>x; }
localitatile intre for(i=1;i<=n;i++) int main()
care exista if(viz[i]==0) {
legatura df(i,++nr); citire();
telefonica for(i=1;i<=n;i++) nr=0;
directa. if(a[i][x]==1) for(int i=1; i<=n; i++)
Exemplu : g<<i<<" "; if(!viz[i])
g<<endl; {
Graf.in for(i=1;i<=n;i++) nr++;
if(viz[i]==viz[x]) df(i, nr);
87 a. 1 4 8 g<<i<<" "; }
b. 1 2 4 for(i=1;i<=nr;i++) {
13 8 { g<<nr<<" componenta
12 c. grup g<<endl<<"grup"<<i<<":"; conexa"<<endl;
1:1 for(j=1;j<=n;j++) for(int i=1; i<=nr; i++)
24 234 if(viz[j]==i) {
8 g<<j<<" "; g<<"componenta"<<i<<":";
34 grup } for(int j=1; j<=n; j++)
2:5 //ptr ultimul subunct faci if(viz[j]==i)
38 if(viz[localitate data 1]==viz[localitate g<<j<<" ";
67
56 data 2]) ca sa aflii daca se poate afla g<<endl;
legatura }
67 return 0; }
}
x=3 }
Date in 8 6
Se da un graf neorientat, sa se 12
#include <iostream> afiseze cate componente conexe 23
#include <fstream> are graful precum si nodurile 45
using namespace std; fiecarei componente conexe 46
ifstream f("date.in"); 56
ofstream g("date.out"); #include <iostream> 78
int #include <fstream> Date out
x1,p,x,viz[100],a[100][100],m,z,n,st[1 using namespace std; 3 componenta conexa
00],r,nr,c,ok1,ok2,t[100],i,ok,j,d[101]; ifstream f("date.in"); componenta1:1 2 3
void citire() ofstream g("date.out"); componenta2:4 5 6
{ int componenta3:7 8
int l,i,j; x1,p,x,viz[100],a[100][100],m,z,n,st[1
f>>n>>m; 00],r,nr,c,ok1,ok2,t[100],i,ok,j,d[101];
for(int x=1; x<=m; x++) void citire()
{ {
f>>i>>j; int l,i,j;
2. Se citesc dintr-un fisier mai g<<"formeaza ciclu"; if(d[i]==d[i+1])
multe secvente de varfuri. Sa return 0; sol++;
se verifice daca o secventa de } g<<sol<<endl;
varfuri ale unui graf f>>x;
formeaza : for(i=1; i<=nr; i++)
a. un ciclu PROBLEMA 7 {
Fie un graf neorientat, cu n for(j=1; j<=n; j++)
#include <iostream> varfuri si m muchii, ale carui if(viz[j]==nr)
#include <fstream> varfuri sunt numerotate de la 1 y++;
using namespace std; la n. if(y==x)
ifstream f("date.in"); for(j=1; j<=n; j++)
ofstream g("date.out"); a) De cate ori se intampla if(viz[j]==nr)
int ca doua varfuri cu g<<j<<" ";
y,sol,x1,p,x,viz[100],a[100][100],m,z, numere de ordine y=0;
n,st[100],r,nr,c,ok1,ok2,t[100],i,ok,j,d[ succesive sa aiba }
101]; acelasi grad? return 0;
void citire() b) Sa se afiseze varfurile }
{ acelei componente
int l,i,j; conexe care are x
f>>n>>m; varfuri, x citit?
for(int x=1; x<=m; x++)
{ #include <iostream>
f>>i>>j; #include <fstream>
a[i][j]=a[j][i]=1; using namespace std;
d[i]++; ifstream f("date.in");
d[j]++; ofstream g("date.out");
int
} y,sol,x1,p,x,viz[100],a[100][100],m,z,
} n,st[100],r,nr,c,ok1,ok2,t[100],i,ok,j,d[
void df(int i,int nr) 101];
{ void citire()
viz[i]=nr; {
for(int j=1; j<=n; j++) int l,i,j;
if(a[i][j]==1 && viz[j]==0) f>>n>>m;
df(j,nr); for(int x=1; x<=m; x++)
} {
int main() f>>i>>j;
{ a[i][j]=a[j][i]=1;
citire(); d[i]++;
for(i=1;i<=n;i++) d[j]++;
if(viz[i]==0)
df(i,++nr); }
f>>x1; }
y=viz[x1]; void df(int i,int nr)
if(d[x1]>=2) {
sol++; viz[i]=nr;
ok=1; for(int j=1; j<=n; j++)
while(f>>x1) if(a[i][j]==1 && viz[j]==0)
{ df(j,nr);
if(y!=viz[x1]) }
ok=0; int main()
if(d[x1]>=2) {
sol++; citire();
} for(i=1; i<=n; i++)
if(ok==0||sol<3) if(viz[i]==0)
g<<"nu formeaza ciclu"; df(i,++nr);
else for(i=1; i<n; i++)
Cel mai lung drum dintre 2 noduri int main()
#include<fstream> {
using namespace std; citire();
ifstream f("date.in"); nr=0;
ofstream g("date.out"); for(int i=1;i<=n;i++)
int if(!viz[i])
v[100],j,i,x,n,maxi,m,viz[100],a[100][ df(i,++nr);
100],d[100],nr,y,z,st[100]; for(x=1;x<=n;x++)
void citire() {
{ st[1]=x;
f>>n>>m; backk(2);
for(i=1;i<=n;i++) }
{ for(i=1;i<=maxi;i++)
f>>x>>y; g<<v[i]<<" ";
a[x][y]=a[y][x]=1; g<<endl<<maxi;
d[x]++; }
d[y]++;
}
}
void df(int i,int nr)
{
viz[i]=nr;
for(j=1;j<=n;j++)
if(a[i][j]&&!viz[j])
df(j,nr);
}
void tipar(int k)
{
if(k>maxi)
{maxi=k;
for(int j=1; j<=k; j++)
v[j]=st[j];
}

}
int valid(int k)
{
if(a[st[k-1]][st[k]]!=1)
return 0;
for(int j=1;j<k;j++)
if(st[j]==st[k])
return 0;
return 1;
}
void backk(int k)
{
int i;
for(i=1; i<=n; i++)
{
st[k]=i;
if(valid(k))
if(st[k]==5)
tipar(k);
else
backk(k+1);

}
}