Sunteți pe pagina 1din 5

Se sa un graf neorientat cu n varfuri si m muchii, fara varfuri izolate.

Sa se determine daca este eulerian si in caz afirmativ sa se afiseze un ciclu eulerian.


Pentru determinarea ciclului eulerian nu se va folosi metoda backtracking.
date.in:
6 10
12
16
23
25
26
34
35
36
45
56
date.out:
este eulerian
12356254361

#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int n,m,A[100][100],P[100],k,G[100];
void citire()
{
int x,y;
fin>>n>>m;
for(int i=1;i<=m;i++)
{
fin>>x>>y;
A[x][y]=A[y][x]=1;
}
}
int grad(int k)//calculeaza gradul varfului k
{
int s=0;
for(int i=1;i<=n;i++)
if(A[k][i]==1) s++;
return s;
}
void DF(int s)//parcurge graful din varful s si marcheaza varfurile
accesibile
{
P[s]=1;
for(int i=1;i<=n;i++)
if(A[s][i]==1 && P[i]==0)
DF(i);
}

int conex()//conexitatea grafului


{
DF(1);
for(int i=1;i<=n;i++)
if(P[i]==0) return 0;
return 1;
}
int euler()//daca este eulerian
{
if(!conex()) return 0;//conex
for(int i=1;i<=n;i++)
if(G[i]%2==1) return 0;//si toate gradele pare
return 1;
}
void ciclu_eulerian(int k)//construieste un ciclu eulerian
{
int maxx=0,nmax=0;
fout<<k<<" "; //afiseaza varful curent
for(int i=1;i<=n;i++)//cauta varful urmator cu grad maxim
{
if(A[k][i]==1)
if(G[i]>maxx)
{
maxx=grad(i);
nmax=i;
}
}
if(nmax!=0)
{
A[k][nmax]=A[nmax][k]=0;//sterge mughia
G[k]--;//scade gradele
G[nmax]--;
ciclu_eulerian(nmax);//merge in varful urmator
}
}
int main()
{
citire();
for(int i=1;i<=n;i++) G[i]=grad(i);
if(euler())
{
fout<<"este eulerian\n";
ciclu_eulerian(1);
}
else fout<<"nu este eulerian\n";
fin.close();
fout.close();
return 0;
}

Se da un graf neorientat cu n varfuri si m muchii. Afisati grupurile de muchii incidente.


Exemplu
n=5 , m=4
muchiile:
[1,2]
[1,3]
[1,4]
[3,4]
grupurile de muchii incidente sunt
[1,2] [1,3] [1,4]
[1,3] [3,4]
[1,4] [3,4]

#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int n,m,a[100][100];
void citire()
{
fin>>n>>m;
for(int i=0;i<=m;i++)
{
int x,y;
fin>>x>>y;
a[x][y]=a[y][x]=1;
}
}
int grad(int v)
{
int g=0;
for(int i=1;i<=n;i++)
g=g+a[v][i];
return g;
}
int main()
{
citire();
for(int i=1;i<=n;i++)
if(grad(i)>=2)
{
for(int j=1;j<=n;j++)
if(a[i][j]==1) fout<<"["<<i<<","<<j<<"] ";
fout<<endl;
}
fin.close();
fout.close();
return 0;
}

Se da un graf neorientat cu n varfuri si m muchii prin lista muchiilor. Afisati numarul minim de
muchii care trebuie adaugate in graf pentru ca acesta sa fie conex si muchiile care trebuie adaugate.
Exemplu:
date.in
12 11
12
13
14
28
36
37
46
45
7 10
6 10
12 11
date.out
2
19
9 11
(muchiile nu sunt unice!)

#include<fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int a[100][100],k,n,m,p[100],v[100],c;
void citire()
{
int i,j,x;
fin>>n>>m;
for(x=1;x<=m;x++)
{ fin>>i>>j;
a[i][j]=1;
a[j][i]=1;
}
}
void df(int k)
{
int i;
p[k]=1;
for(i=1;i<=n;i++)
if(a[k][i]==1 && p[i]==0)
df(i);
}
int main()
{
citire();
for(k=1;k<=n;k++)
if(!p[k])

{
v[++c]=k;
df(k);
}
fout<<c-1<<endl;
for(int i=1;i<c;i++) fout<<v[i]<<" "<<v[i+1]<<endl;
fin.close();
fout.close();
return 0;
}

S-ar putea să vă placă și