Pagini recente » Cod sursa (job #1316660) | Cod sursa (job #2922038) | Cod sursa (job #1405717) | Cod sursa (job #2291887) | Cod sursa (job #2925909)
#include <fstream>
#include <bits/stdc++.h>
#define N 200005
#define M 200005
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
int G[N][N];
int disc[N] = {-1}, lowLink[N] = {-1};
bool stkItem[N];
stack <int> stk;
int viz[N];
int n, m, i, j, x, y;
int min(int a, int b) {
if( a < b) return a;
return b;
}
void Input(){
fin >> n >> m;
for(i=1; i<=m; i++)
{
fin >> x >> y;
G[x][y] = 1;
G[y][x] = 1;
}
}
void findComponent(int node){
static int time = 0;
disc[node] = lowLink[node] = ++time;
stk.push(node);
stkItem[node] = 1;
for( i = 0; i < n; i++)
if(G[node][i] == 1)
if(disc[i] == -1) {
findComponent(i);
lowLink[node] = min (lowLink[node], lowLink[i]);
}
else if(stkItem[i]==1)
lowLink[node] = min (lowLink[node], disc[i]);
int poppedItem = 0;
if(lowLink[node] == disc[node]){
while(stk.top() != node) {
poppedItem = stk.top();
fout << poppedItem <<" ";
stkItem[poppedItem] = 0;
}
poppedItem = stk.top();
fout << poppedItem <<"\n";
stkItem[poppedItem] = 0;
stk.pop();
}
}
void SCC(){
for(i = 0; i < n; i++)
if(disc[i] == -1)
findComponent(i);
}
int main()
{
Input();
SCC();
return 0;
}