Pagini recente » Cod sursa (job #1514797) | Cod sursa (job #2134450) | Cod sursa (job #1925550) | Cod sursa (job #105550) | Cod sursa (job #2793054)
#include <bits/stdc++.h>
using namespace std;
class Graf {
private:
int nr_noduri;
int nr_muchii;
vector<vector <int>> lista_vecini;
public:
Graf();
Graf(int nr_noduri, int nr_muchii);
~Graf();
vector<vector<int>> getlista_vecini();
void graf_neorientat(istream &fis_sursa);
void graf_orientat(istream &fis_sursa);
void DFS(int nod, vector<bool> &vizitat);
int comp_conexe();
void BFS(int nod, ostream &fis_destinatie);
void hakimi(int noduri, vector<int> &lista, ostream &fis_destinatie);
void DFS_sortaret(queue<int> &ordine, bool &ciclu);
};
Graf::Graf()
{
nr_noduri = 0;
nr_muchii = 0;
}
Graf::Graf(int nr_noduri_fis, int nr_muchii_fis)
{
vector<int> v(1,-1);
nr_noduri = nr_noduri_fis;
nr_muchii = nr_muchii_fis;
for(int i = 1; i <= nr_noduri; i++)
lista_vecini.push_back(v);
}
Graf::~Graf()
{
nr_noduri = 0;
nr_muchii = 0;
lista_vecini.clear();
}
vector<vector<int>> Graf::getlista_vecini()
{
return lista_vecini;
}
void Graf::graf_neorientat(istream &fis_sursa)
{
int a, b;
for(int i = 1; i <= nr_muchii; i++)
{
fis_sursa >> a >> b;
lista_vecini[a].push_back(b);
lista_vecini[b].push_back(a);
}
}
void Graf::graf_orientat(istream &fis_sursa)
{
int a, b;
for(int i = 1; i <= nr_muchii; i++)
{
fis_sursa >> a >> b;
lista_vecini[a-1].push_back(b-1);
}
}
void Graf::DFS(int nod, vector<bool> &viz)
{
viz[nod] = 1;
for(int i = 1; i < lista_vecini[nod].size(); i++)
if(viz[lista_vecini[nod][i]] == 0)
DFS(lista_vecini[nod][i], viz);
}
int Graf::comp_conexe()
{
int nr = 0;
vector<bool> viz(nr_noduri + 1, 0);
for(int i = 1; i <= nr_noduri; i++)
if(!viz[i])
{
nr++;
DFS(i, viz);
}
return nr;
}
void Graf::BFS(int nod, ostream &fis_destinatie)
{
int a;
queue<int> coada;
vector<int> dist(nr_noduri, -1);
dist[nod-1] = 0;
coada.push(nod-1);
while(!coada.empty())
{
a = coada.front();
coada.pop();
for(auto& i: lista_vecini[a])
if(dist[i] == -1)
{
dist[i] = dist[a] + 1;
coada.push(i);
}
}
for(int i = 0; i < nr_noduri; i++)
fis_destinatie << dist[i] << " ";
}
void Graf::hakimi(int noduri, vector<int> &lista, ostream &fis_destinatie)
{
int cond = 0;
while(cond == 0)
{
sort(lista.begin(), lista.end(), greater<>());
if ( lista[0] == 0)
cond = 1;
cout<<lista[0]<<" ";
int aux = lista[0];
lista.erase(lista.begin() + 0);
if(aux > lista.size())
cond = -1;
for(int i = 0; i < aux; i++)
{
lista[i]--;
if(lista[i] < 0)
cond = -1;
}
}
if(cond == 1)
fis_destinatie << "DA\n";
else
fis_destinatie << "NU\n";
}
void Graf::DFS_sortaret(queue<int> &lista, bool &ciclu)
{
int counter = 0;
queue<int> nod_grade;
vector<int> grade_interne(nr_noduri, 0);
for(int i = 1; i <= nr_noduri; i++)
for(int j = 1; j < lista_vecini[i].size(); j++)
grade_interne[lista_vecini[i][j]] += 1;
for(int i = 1; i <= nr_noduri; i++)
if(grade_interne[i] == 0)
nod_grade.push(i-1);
while(!nod_grade.empty())
{
int aux = nod_grade.front();
nod_grade.pop();
lista.push(aux);
counter++;
for(int i = 0; i < lista_vecini[aux].size(); i++)
{
grade_interne[lista_vecini[aux][i]]--;
if(grade_interne[lista_vecini[aux][i]] == 0)
nod_grade.push(lista_vecini[aux][i]);
}
}
if(counter != nr_noduri)
ciclu = 1;
}
void pb1_BFS()
{
ifstream f("bfs.in");
ofstream g("bfs.out");
int N, M, S;
f >> N >> M >> S;
Graf graf(N, M);
graf.graf_orientat(f);
graf.BFS(S, g);
f.close();
g.close();
}
void pb2_DFS()
{
ifstream f("dfs.in");
ofstream g("dfs.out");
int N, M;
f >> N >> M;
Graf graf(N, M);
graf.graf_neorientat(f);
g << graf.comp_conexe();
f.close();
g.close();
}
void hakimi()
{
ifstream f("hakimi.in");
ofstream g("hakimi.out");
int N;
vector<int> V(100005);
f >> N;
for(int i = 0; i < N; i++)
f >> V[i];
Graf graf(N, 0);
graf.hakimi(N, V, g);
f.close();
g.close();
}
void sortaret()
{
ifstream f("sortaret.in");
ofstream g("sortaret.out");
int N, M;
bool ciclu = 0;
queue<int> lista;
f >> N >> M;
Graf graf(N, M);
graf.graf_orientat(f);
graf.DFS_sortaret(lista, ciclu);
if(!ciclu)
{
while(!lista.empty())
{
g << lista.front()<<" ";
lista.pop();
}
}
else
g << "Graful nu poate avea o sortare topologica!";
f.close();
g.close();
}
int main() {
sortaret();
return 0;
}