Cod sursa(job #854066)

Utilizator krissu93FMI Tiugan Cristiana Elena krissu93 Data 12 ianuarie 2013 19:05:29
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
//algoritmul lui tarjan
#include <fstream>
#include <iostream>
#include <vector>
#include <stack>
#define min1(a,b) ((a) < (b) ? (a) : (b))

using namespace std;

ifstream in("ctc.in");
ofstream out("ctc.out");

vector <int> vecini[100009];
stack <int> s;
vector <int>solutie[100009];
int index[100009];
int lowlink[100009];
int viz[100009];//e in stack
int n,m;
int ind=0;
int nr=0;
void get_data(){
	in>>n>>m;
	for (int i=1;i<=m;i++){
		int x,y;
		in>>x>>y;
		vecini[x].push_back(y);
	}
}

void tarjan(const int nod,const vector<int>* vecini){
	int i;
	index[nod]=ind;
	lowlink[nod]=ind;
	ind++;
	viz[nod]=1;
	s.push(nod);
	for(i=0;i<vecini[nod].size();i++){
		if (index[vecini[nod][i]]== -1){
			tarjan(vecini[nod][i],vecini);

			lowlink[nod]=min1(lowlink[nod],lowlink[vecini[nod][i]]);
		}
		else{
			if (viz[vecini[nod][i]]==1){
				lowlink[nod]=min1(lowlink[nod],lowlink[vecini[nod][i]]);
			}
		}
	}
	if (lowlink[nod]==index[nod]){
		nr++;
		int nod1;
		do{
			 nod1=s.top();
			solutie[nr].push_back(nod1);
			s.pop();
			viz[nod1]=0;
		}
	
		while (nod1!=nod);
		cout<<nr<<'\n';
		for (int j=0;j<solutie[nr].size();j++)
			cout<<solutie[nr][i]<<' ';
		cout<<'\n';
	}
}
void init(){
	for (int i=1;i<=n;i++){
		viz[i]=0;
		index[i]=-1;
		lowlink[i]=0;
	}
}
		
int main(){
	get_data();
	init();

	for (int i=1;i<=n;i++){
		if (index[i]==-1)
		{
			cout<<i<<' ';
			tarjan(i,vecini);
		}
	}
	out<<nr<<'\n';
	for (int i=1;i<=nr;i++)
	{
		for (int j=0;j<solutie[i].size();j++){
			out<<solutie[i][j]<<' ';
		}
		out<<'\n';
	}
	return 0;
}