Pagini recente » Cod sursa (job #123762) | Cod sursa (job #1028183) | Cod sursa (job #2674514) | Cod sursa (job #2471487) | Cod sursa (job #2796845)
#include <iostream>
#include <vector>
#include <fstream>
#include <stack>
using namespace std;
ifstream f("sortaret.in");
ofstream g("sortaret.out");
class Graf{
int numar_noduri;
int numar_muchii;
int start;
vector<vector<int>> vecini;
public:
Graf(){
numar_muchii = 0;
numar_noduri = 0;
start = 0;
};
void citire_date_orientat_start();
void citire_date_neorientat();
void citire_date_orientat();
void bfs(int);
void dfs(vector<bool>&,int);
void dfs_topo(vector<bool>&, int, vector<int>&);
void sortare_topologica();
int numar_componente_conexe();
int get_start();
};
int Graf::get_start(){
return start;
}
void Graf::bfs(int start){
vector<int> coada;
vector<int> drum_min(numar_noduri+1,-1);
vector<bool> vizitat(numar_noduri+1,false);
drum_min[start] = 0;
coada.push_back(start);
vizitat[start] = true;
int inc = 0, sf = 0;
while(inc <= sf){
for(int i = 0; i < vecini[coada[inc]].size(); i++)
if(vizitat[vecini[coada[inc]][i]] == false){
coada.push_back(vecini[coada[inc]][i]);
sf++;
drum_min[vecini[coada[inc]][i]] = drum_min[coada[inc]] + 1;
vizitat[vecini[coada[inc]][i]] = true;
}
inc++;
}
for(int i = 1; i <= numar_noduri; i++)
g<<drum_min[i]<<" ";
}
void Graf::dfs(vector<bool> &vizitat, int start){
vizitat[start] = true;
for(int i = 0; i < vecini[start].size(); i++)
if(vizitat[vecini[start][i]] == false)
dfs(vizitat,vecini[start][i]);
}
int Graf::numar_componente_conexe(){
vector<bool> vizitat(numar_noduri+1, false);
int cnt = 0;
for(int i = 1; i <= numar_noduri; i++)
if(vizitat[i] == false){
cnt++; dfs(vizitat,i);
}
return cnt;
}
void Graf::citire_date_orientat_start(){
f>>numar_noduri;
f>>numar_muchii;
f>>start;
int n1,n2;
vecini.resize(numar_noduri+1);
for(int i = 0; i < numar_muchii; i++){
f>>n1>>n2;
vecini[n1].push_back(n2);
}
}
void Graf::citire_date_neorientat(){
f>>numar_noduri;
f>>numar_muchii;
int n1,n2;
vecini.resize(numar_noduri+1);
for(int i = 0; i < numar_muchii; i++){
f>>n1>>n2;
vecini[n1].push_back(n2);
vecini[n2].push_back(n1);
}
}
void Graf::dfs_topo(vector<bool> &vizitat, int start, vector<int> &stk){
vizitat[start] = true;
int i;
for(i = 0; i < vecini[start].size(); i++)
if(vizitat[vecini[start][i]] == false)
dfs_topo(vizitat, vecini[start][i], stk);
stk.push_back(start);
}
void Graf::sortare_topologica(){
vector<bool> vizitat(numar_noduri+1,false);
vector<int> stk;
for(int i = 1; i <= numar_noduri; i++){
if(vizitat[i] == false){
dfs_topo(vizitat,i,stk);
}
}
for(int i = stk.size() - 1; i >= 0; i--)
g<<stk[i]<<" ";
}
void Graf::citire_date_orientat(){
f>>numar_noduri;
f>>numar_muchii;
int n1,n2;
vecini.resize(numar_noduri+1);
for(int i = 0; i < numar_muchii; i++){
f>>n1>>n2;
vecini[n1].push_back(n2);
}
}
int main()
{
Graf a;
///a.citire_date_start();
///a.bfs(a.get_start());
///a.citire_date_neorientat();
///g<<a.numar_componente_conexe();
a.citire_date_orientat();
a.sortare_topologica();
return 0;
}