Skip to content

Commit 09ffc3f

Browse files
author
Barbu Paul - Gheorghe
committed
added graph algorithms
1 parent 289b13f commit 09ffc3f

6 files changed

+630
-0
lines changed

bf_df.cpp

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#include <iostream>
2+
#include <fstream>
3+
4+
using namespace std;
5+
6+
int c[100], viz[100], n, a[100][100];
7+
8+
void bf(int x){
9+
c[0] = x;
10+
viz[x] = 1;
11+
int p = 0;
12+
int u = 0;
13+
14+
while(p<=u){
15+
int k = c[p];
16+
17+
for(int i=1; i<=n; i++){
18+
if(1 == a[k][i] && 0 == viz[i]){
19+
u++;
20+
c[u] = i;
21+
viz[i] = 1;
22+
}
23+
}
24+
25+
p++;
26+
}
27+
}
28+
29+
void bf_tip(){
30+
int i=0;
31+
32+
while(c[i]){
33+
cout<<c[i++]<<' ';
34+
}
35+
}
36+
37+
void init(){
38+
for(int i=0; i<=n; i++){
39+
c[i] = 0;
40+
viz[i] = 0;
41+
}
42+
}
43+
44+
void df(int x){
45+
viz[x] = 1;
46+
cout<<x<<' ';
47+
48+
for(int i=1; i<=n; i++){
49+
if(a[x][i] && !viz[i]){
50+
df(i);
51+
}
52+
}
53+
}
54+
55+
int main(){
56+
int m, x, y;
57+
ifstream f("bf_df.in");
58+
59+
f>>n>>m;
60+
for(int i=0; i<=m; i++){
61+
f>>x>>y;
62+
a[x][y] = a[y][x] = 1;
63+
}
64+
65+
cout<<"BF:\n";
66+
67+
for(int i=1; i<=n; i++){
68+
bf(i);
69+
bf_tip();
70+
init();
71+
cout<<"\n";
72+
}
73+
74+
cout<<"DF:\n";
75+
76+
for(int i=1; i<=n; i++){
77+
df(i);
78+
init();
79+
cout<<"\n";
80+
}
81+
82+
f.close();
83+
}
84+

dijkstra.cpp

+99
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
#include <iostream>
2+
#include <fstream>
3+
#include <climits>
4+
5+
//#define INT_MAX 1000
6+
7+
using namespace std;
8+
9+
int m, n, a[100][100], x;
10+
11+
ifstream f("graf.txt");
12+
13+
void init_matrice(){
14+
for(int i=1; i<=n; i++){
15+
for(int j=1; j<=n; j++){
16+
//if(i == j){
17+
// a[i][i] = 0;
18+
//}
19+
//else{
20+
a[i][j] = INT_MAX;
21+
//}
22+
}
23+
}
24+
}
25+
26+
void citire(){
27+
int x, y;
28+
29+
for(int i=0; i<m; i++){
30+
f>>x>>y;
31+
f>>a[x][y];
32+
}
33+
}
34+
35+
/* DIJKSTRA */
36+
int s[100], d[100], t[100];
37+
38+
void init_dijkstra(int n, int x){
39+
s[x] = 1;
40+
41+
for(int i=1; i<=n; i++){
42+
d[i] = a[x][i];
43+
44+
if(a[x][i] != INT_MAX && a[x][i] != 0){
45+
t[i] = x;
46+
}
47+
}
48+
}
49+
50+
void dijkstra(int x){
51+
int minim = INT_MAX, p;
52+
53+
for(int i=1; i<n; i++){
54+
minim = INT_MAX;
55+
for(int j=1; j<=n; j++){
56+
if(!s[j] && d[j] < minim){
57+
minim = d[j];
58+
p = j;
59+
}
60+
}
61+
62+
s[p] = 1;
63+
64+
if(minim == INT_MAX){
65+
return;
66+
}
67+
68+
for(int j=1; j<=n; j++){
69+
if(d[p] + a[p][j] < d[j] && a[p][j] != INT_MAX){
70+
d[j] = d[p] + a[p][j];
71+
t[j] = p;
72+
}
73+
}
74+
}
75+
}
76+
77+
void afisare(int x, int y){
78+
if(t[y] != 0){
79+
afisare(x, t[y]);
80+
cout<<y<<' ';
81+
}
82+
else{
83+
cout<<x<<' ';
84+
}
85+
}
86+
87+
int main(){
88+
f>>n>>m;
89+
90+
init_matrice();
91+
citire();
92+
f>>x;
93+
init_dijkstra(n, x);
94+
95+
dijkstra(x);
96+
afisare(x, 1);
97+
98+
f.close();
99+
}
+131
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
#include <iostream>
2+
#include <fstream>
3+
4+
using namespace std;
5+
6+
int st[100], a[100][100], n, m, uz[100], hamiltonian = 0;
7+
8+
9+
// GRAF HAMILTONIAN
10+
int valid(int k){
11+
if(k == 1){
12+
return 1;
13+
}
14+
15+
if(a[st[k]][st[k-1]]){
16+
return 1; //exista muchie intre nodul curent si cel precedent
17+
}
18+
19+
return 0;
20+
}
21+
22+
void tip(int k){
23+
for(int i=1; i<=k; i++){
24+
cout<<st[i]<<' ';
25+
}
26+
27+
cout<<"\n";
28+
}
29+
30+
int sol(int k){
31+
if(k == n && a[st[k]][st[1]]){
32+
return 1;
33+
}
34+
35+
return 0;
36+
}
37+
38+
void ch(int k){
39+
for(int i=1; i<=n; i++){
40+
st[k] = i;
41+
42+
if(!uz[i] && valid(k)){
43+
uz[i] = 1;
44+
45+
if(sol(k)){
46+
hamiltonian = 1;
47+
//tip(k);
48+
return;
49+
}
50+
else{
51+
ch(k+1);
52+
}
53+
54+
uz[i] = 0;
55+
}
56+
}
57+
}
58+
59+
//GRAF EULERIAN
60+
int grad(int x){
61+
int s=0;
62+
63+
for(int i=1; i<=n; i++){
64+
if(a[x][i]){
65+
s++;
66+
}
67+
}
68+
69+
return s;
70+
}
71+
72+
int grade_pare(){
73+
for(int i=1; i<=n; i++){
74+
if(grad(i) % 2 != 0){
75+
return 0;
76+
}
77+
}
78+
79+
return 1;
80+
}
81+
82+
//GRAF CONEX
83+
int conex(){
84+
for(int i=1; i<n; i++){
85+
for(int j=i+1; j<=n; j++){
86+
if(a[i][j] == 0){
87+
return 0;
88+
}
89+
}
90+
}
91+
92+
return 1;
93+
}
94+
95+
void rw(){
96+
for(int k=1; k<=n; k++){
97+
for(int i=1; i<=n; i++){
98+
if(i != k){
99+
for(int j=1; j<=n; j++){
100+
if(j != k && a[i][j] == 0 && j != i){
101+
a[i][j] = a[i][k] * a[k][j];
102+
}
103+
}
104+
}
105+
}
106+
}
107+
}
108+
109+
int main(){
110+
int z, v;
111+
ifstream f("ghe.in");
112+
113+
f>>n>>m;
114+
115+
for(int i=0; i<m; i++){
116+
f>>z>>v;
117+
a[z][v] = a[v][z] = 1;
118+
}
119+
120+
ch(1);
121+
122+
int gr_pare = grade_pare();
123+
rw();
124+
125+
cout<<"Hamiltonian: "<<hamiltonian;
126+
int eulerian = conex() & gr_pare;
127+
cout<<"\nEulerian: "<<eulerian;
128+
129+
130+
f.close();
131+
}

0 commit comments

Comments
 (0)