Pagini recente » Cod sursa (job #2250973) | Cod sursa (job #43193) | Cod sursa (job #967795) | Cod sursa (job #2399500) | Cod sursa (job #2797165)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
class Graph
{
private:
int verticesNo;
int edgesNo;
bool oriented;
vector<vector<int>> adjacencyList;
public:
Graph();
Graph(int verticesNo, int edgesNo);
Graph(int verticesNo, int edgesNo, bool oriented);
Graph transpose();
void bfs(int start); //BFS
void dfs(int vertex, vector<int> &visited); //DFS
void dfsWstack(int vertex, vector<int> &visited, stack<int> &st);
void stronglyConnectedComponents();
int connectedComponentsNo(); //DFS
void topologicalSort();
void HH();
virtual ~Graph();
};
Graph::Graph()
{
verticesNo = edgesNo = oriented = 0;
this->adjacencyList.clear();
}
Graph::Graph(int verticesNo, int edgesNo)
{
this->verticesNo = verticesNo;
this->edgesNo = edgesNo;
this->adjacencyList.resize(verticesNo+1);
}
Graph::Graph(int verticesNo, int edgesNo, bool oriented)
{
this->verticesNo = verticesNo;
this->edgesNo = edgesNo;
this->oriented = oriented;
this->adjacencyList.resize(verticesNo + 1);
int vertex1, vertex2;
for(int i = 0; i < this->edgesNo; i++)
{
fin>>vertex1>>vertex2;
this->adjacencyList[vertex1].push_back(vertex2);
if(this->oriented == 0)
this->adjacencyList[vertex2].push_back(vertex1);
}
}
Graph::~Graph()
{
this->adjacencyList.clear();
}
void Graph::bfs(int start)
{
int n = this->verticesNo;
vector<int> visited;
vector<int> distances;
queue<int> order;
order.push(start);
for(int i = 0; i <= n; i++)
{
visited.push_back(0);
distances.push_back(-1);
}
distances[start] = 0;
visited[start] = 1;
while(!order.empty())
{
int current = order.front();
int sz = adjacencyList[current].size();
order.pop();
for(int i = 0; i < sz; i++)
{
int temp = adjacencyList[current][i];
if(visited[temp] == 0)
{
visited[temp] = 1;
order.push(temp);
distances[temp] = distances[current]+1;
}
}
}
for(int i = 1; i < distances.size(); i++)
fout<<distances[i]<<" ";
}
void Graph::dfs(int vertex, vector<int> &visited)
{
visited[vertex] = 1;
fout<<vertex<<" ";
int sz = adjacencyList[vertex].size();
for(int i = 0; i < sz; i++)
{
if(visited[adjacencyList[vertex][i]] == 0)
dfs(adjacencyList[vertex][i],visited);
}
}
int Graph::connectedComponentsNo()
{
vector<int> visited;
int ccn = 0; //no of connected components
for(int i = 0 ; i <= this->verticesNo; i++)
visited.push_back(0);
for(int i = 0; i <= this->verticesNo; i++)
if(visited[i] == 0)
{
dfs(i,visited);
ccn++;
}
return ccn;
}
void Graph::stronglyConnectedComponents()
{
stack<int> st;
vector<int> visited;
int sccn = 0;
for(int i = 0; i <= verticesNo; i++)
{
visited.push_back(0);
}
for(int i = 1; i <= verticesNo; i++)
if(visited[i] == 0)
dfsWstack(i,visited,st);
Graph tg = transpose();
for(int i = 0; i <= verticesNo; i++)
visited[i] = 0;
while(!st.empty())
{
int temp = st.top();
st.pop();
if(visited[temp] == 0)
{
tg.dfs(temp,visited);
sccn++;
fout<<endl;
}
}
fout<<sccn<<endl;
}
void Graph::dfsWstack(int vertex, vector<int> &visited, stack<int> &st)
{
visited[vertex] = 1;
int sz = adjacencyList[vertex].size();
for(int i = 0; i < sz; i++)
{
if(visited[adjacencyList[vertex][i]] == 0)
dfsWstack(adjacencyList[vertex][i],visited,st);
}
st.push(vertex);
}
void Graph::topologicalSort()
{
stack<int> st;
vector<int> visited;
for(int i = 0; i <= this->verticesNo; i++)
visited.push_back(0);
for(int i = 1 ; i <=this->verticesNo; i++)
if(visited[i] == 0)
{dfsWstack(i,visited,st);}
while(!st.empty())
{
fout<<st.top()<<" ";
st.pop();
}
}
void Graph::HH()
{
int n,temp;
vector<int> seq;
fin>>n;
for(int i = 0; i < n; i++)
{
fin>>temp;
seq.push_back(temp);
}
while(true)
{
sort(seq.begin(),seq.end());
int sz = seq.size()-1;
if(seq[sz] == 0)
{
cout<<1;
return;
}
int v = seq[sz];
seq.pop_back();
if(v > seq.size())
{
cout<<0;
return;
}
for(int i = v-1; i >=0; i--)
{
seq[i]--;
if(seq[i] < 0)
{
cout<<0;
return;
}
}
}
}
Graph Graph::transpose()
{
Graph transposedGraph(verticesNo, edgesNo);
for(int v = 1; v <= verticesNo; v++)
{
int sz = adjacencyList[v].size();
for(int i = 0; i < sz; i++)
{
transposedGraph.adjacencyList[i].push_back(v);
}
}
/*
for (int v = 1; v <= verticesNo; v++)
{
// Recur for all the vertices adjacent to this vertex
for(auto i = adjacencyList[v].begin(); i != adjacencyList[v].end(); ++i)
{
transposedGraph.adjacencyList[*i].push_back(v);
}
}
*/
return transposedGraph;
}
int main()
{
int N,M;
fin>>N>>M;
Graph g(N,M,1);
g.stronglyConnectedComponents();
return 0;
return 0;
}