Cod sursa(job #2295661)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 3 decembrie 2018 20:37:12
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.11 kb
#include<stdio.h>
#include<stdlib.h>

#include<vector>
#include<stack>
using namespace std;

#define MAXN 100000
#define MAXM 200000

int M,N;
vector<int> L[MAXN+1];

bool viz[MAXN+1];

typedef struct nod{
	int index;
	int low;
	bool instack;
}nod;

nod V[MAXN+1];
int S[MAXN];
int stackindex;
int index=1;

int nbcomp;
vector<int> C[MAXN];

void componente(int nod){
	stack<pair<int,vector<int>::iterator>> stk;
	vector<int>::iterator it,temp;
	int vecin;
	bool go=true;
	
	do{
		if(!go){ //comeback 
			nod=stk.top().first;
			temp=stk.top().second;
			stk.pop();
			
			vecin=*temp;
			if(V[nod].low > V[vecin].low)
				V[nod].low = V[vecin].low;
			temp++;
		}
		else{
			viz[nod]=true;
			V[nod].index = index;
			V[nod].low = index;
			V[nod].instack = true;
			index++; 

			S[stackindex]=nod;
			stackindex++;

			temp=L[nod].begin();
		}

		go=false;

		for(it=temp;it!=L[nod].end();it++){		
			vecin=*it;
			if(!viz[vecin]){
				//componente(vecin);
				stk.push(make_pair(nod,it));
				nod=vecin;
				go=true;			
				break;
			}
			else{
				if(V[vecin].instack){ 
					if(V[nod].low > V[vecin].index)
						V[nod].low = V[vecin].index;
				}
			}
		}

		if(go)
			continue;

		if (V[nod].low == V[nod].index){
			// start a new strongly connected component
			while(S[stackindex-1]!=nod){
				C[nbcomp].push_back(S[stackindex-1]);
				V[S[stackindex-1]].instack=false;
				stackindex--;
			}
			C[nbcomp].push_back(S[stackindex-1]);
			V[S[stackindex-1]].instack=false;
			stackindex--;

			nbcomp++;
		}

	}while(!stk.empty());
}

int main(){
		
	freopen("ctc.in", "r", stdin);
	//freopen("ctc_test10.in", "r", stdin);
	freopen("ctc.out", "w", stdout);

	scanf("%d %d",&N,&M);

	int x,y;

	for(int i=0;i<M;i++){
		scanf("%d %d",&x,&y);
		if(x!=y)
			L[x].push_back(y);
	}

	for(int i=1;i<=N;i++){
		if(!viz[i])
			componente(i);
	}

	printf("%d\n",nbcomp);

	vector<int>::iterator it;
	for(int i=0;i<nbcomp;i++){
		for(it=C[i].begin();it!=C[i].end();it++){
			printf("%d ",*it);
		}
		printf("\n");
	}

	return 0;
}