Pagini recente » Cod sursa (job #1998719) | Cod sursa (job #2060813) | Cod sursa (job #1746487) | Cod sursa (job #2238362) | Cod sursa (job #659867)
Cod sursa(job #659867)
#include <fstream>
#include <iostream>
#include <vector>
#include <stack>
#include <bitset>
#define min(a,b) \
({ typeof(a) _a = (a); \
typeof(b) _b = (b); \
_a<=_b ? _a : _b; \
})
#define MAXN 100000
using namespace std;
struct Node
{
Node() : index(-1), lowlink(0), bIsOnStack(false)
{}
int index, lowlink;
bool bIsOnStack;
};
typedef unsigned int uint32;
typedef vector<vector<int> > Graph;
typedef vector<vector<int> > Scc;
void StronglyConnectedComponent
(
const Graph& graph,
Node *nodes,
stack<int>& S,
const int node,
int& index,
Scc& sccs,
int& numComp
)
{
nodes[node].index = index;
nodes[node].lowlink = index;
index++;
S.push(node);
nodes[node].bIsOnStack = true;
for (int i=0; i<graph[node].size(); ++i)
{
if (-1 == nodes[graph[node][i]].index)
{
StronglyConnectedComponent(graph, nodes, S, graph[node][i], index, sccs, numComp);
nodes[node].lowlink = min(nodes[node].lowlink, nodes[graph[node][i]].lowlink);
}
else if (nodes[graph[node][i]].bIsOnStack)
{
nodes[node].lowlink = min(nodes[node].lowlink, nodes[graph[node][i]].index);
}
}
if (nodes[node].lowlink == nodes[node].index)
{
int curNode;
do
{
curNode = S.top();
sccs[numComp].push_back(curNode);
S.pop();
} while(!S.empty() && curNode!=node);
numComp++;
}
}
int StronglyConnectedComponents(const Graph& graph, Scc& sccs)
{
int index = 0, numComp = 0;
Node *nodes;
stack<int> S;
nodes = new Node[graph.size()+1];
sccs.resize(graph.size());
for (int i=0; i<graph.size(); ++i)
{
if (-1 == nodes[i].index)
{
StronglyConnectedComponent(graph, nodes, S, i, index, sccs, numComp);
}
}
if (!S.empty())
{
int curNode;
do
{
curNode = S.top();
sccs[numComp].push_back(curNode);
S.pop();
numComp++;
} while(!S.empty());
}
delete[] nodes;
return numComp;
}
int main()
{
uint32 n, m, numComp;
Graph graph;
Scc sccs;
fstream fin("ctc.in", fstream::in);
fstream fout("ctc.out", fstream::out);
fin >> n >> m;
//cout << n << " " << m << endl;
graph.resize(n);
for (int i=0; i<m; ++i)
{
uint32 x, y;
fin >> x >> y;
graph[x-1].push_back(y-1);
}
/*for (int i=0; i<n; ++i)
{
cout << i+1 << ": ";
for (int j=0; j<graph[i].size(); ++j)
{
cout << graph[i][j]+1 << " ";
}
cout << endl;
}
cout << endl;*/
numComp = StronglyConnectedComponents(graph, sccs);
fout << numComp << "\n";
for (int i=0; i<numComp; ++i)
{
for (int j=0; j<sccs[i].size(); ++j)
{
fout << sccs[i][j]+1 << " ";
}
fout << "\n";
}
fin.close();
fout.close();
return 0;
}