Pagini recente » Cod sursa (job #2848874) | Cod sursa (job #1769914) | Cod sursa (job #743546) | Cod sursa (job #583744) | Cod sursa (job #2783025)
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
class graph{
int n,m;
vector<vector<int>> arcs;
public:
graph(int n,int m,vector< vector<int>> arcs);
void bfs(int start);
void dfs(int start,vector<bool> &viz);
void componente_conexe();
};
graph::graph(int n,int m,vector< vector<int>> arcs)
{
this->n=n;
this->m=m;
this->arcs=arcs;
}
void graph::bfs(int start)
{
queue<int> que;
que.push(start);
int *dist=new int[this->n];
for(int i=0;i<n;i++)dist[i]=-1;//initializez distantele cu -1
dist[start]=0;//distanta startului e 0
while(!que.empty())//cat timp mai am in coada
{
int current=que.front();//iau elementul curent
que.pop();//il scot din coada
for(unsigned int i=0;i<arcs[current].size();i++)//ii parcurg lista de vecini
{
if(dist[arcs[current][i]]==-1)//daca vecinul e nevizitat
{
dist[arcs[current][i]]=dist[current]+1;//distanta lui devine cea a tatalui +1
que.push(arcs[current][i]);//il pun in coada
}
}
}
ofstream fout("bfs.out");
for(int i=0;i<this->n;i++)
fout<<dist[i]<<' ';//afisez distantele
delete[] dist;//sterg vectorul dinamic
}
void graph::dfs(int start,vector<bool> &viz)
{
viz[start]=true;
for(unsigned int i=0;i<arcs[start].size();i++)//ii parcurg lista de vecini
{
if(!viz[arcs[start][i]])//daca e nevizitat
{
viz[arcs[start][i]]=true;
this->dfs(arcs[start][i],viz);//apelez recursiv dfs pe el
}
}
}
void graph::componente_conexe()
{
vector<bool> viz(n);
for(int i=0;i<n;i++)viz[i]=false;
int componente=0;
for(int i=0;i<n;i++)
if(!viz[i])
{
dfs(i,viz);
componente++;
}
ofstream fout("dfs.out");
fout<<componente;
}
int main()
{
/* int n,m,s;
ifstream fin("bfs.in");
fin>>n>>m>>s;
s--;
vector<vector<int>> arce(n);
int a,b;
for(int i=0;i<m;i++)
{
fin>>a>>b;
a--;b--;
arce[a].push_back(b);
}
graph g(n,m,arce);
g.bfs(s);*/
//^^bfs main
int n,m;
ifstream fin("dfs.in");
fin>>n>>m;
vector<vector<int>> arce(n);
int a,b;
for(int i=0;i<m;i++)
{
fin>>a>>b;
a--;b--;
arce[a].push_back(b);
}
graph g(n,m,arce);
g.componente_conexe();
return 0;
}