Cod sursa(job #571117)

Utilizator tamiraa_emglSugarjav Battamir tamiraa_emgl Data 4 aprilie 2011 03:18:15
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <stack>


using namespace std;

typedef vector<int> *graf;
vector< vector<int> > solutii;

#define ALB 0
#define NEGRU 1

graf G;
stack<int> S;

int* idx,*lowlink,index = 0;
bool *onstack;

void tarjan(int v)
{
 	int u;
	idx[v] = index;
	lowlink[v] = index++;
	S.push(v);
	onstack[v]=true;
	
	for (int i=0;i<G[v].size();i++)
	{
		 u=G[v][i];
		 if (idx[u]==0)
		 {
		       tarjan(u);
		       lowlink[v] = min(lowlink[v], lowlink[u]);
		 } 
		 else if (onstack[u])lowlink[v] = min(lowlink[v], idx[u]);
	}
	
	if (lowlink[v] == idx[v])
	{
       vector<int> sol;
       do
       {
          u = S.top();
	      S.pop();
	      onstack[u]=false;
	      sol.push_back(u+1);
	    }while(u != v);
	    solutii.push_back(sol);
     }
}


int main()
{
    FILE* f,*out;
    
    if(!(f = fopen("ctc.in","r")))return 0;
    
    int n,m,i,j,nod1,nod2;
    
    fscanf(f,"%d %d",&n,&m);
    
    G = new vector<int>[n];
    
    idx = new int[n];
    lowlink = new int[n];
    onstack = new bool[n];
   
    for(i = 0; i < m;i++)
    {
          fscanf(f,"%d %d",&nod1,&nod2);      
          G[nod1-1].push_back(nod2-1);
    }
    fclose(f);
    
  	for(int i=0;i<n;i++)
		idx[i]=0;
		
    for(i = 0;i < n;i++)
        if(!idx[i])tarjan(i);
          
    out = fopen("ctc.out","w");
          
    fprintf(out,"%d",solutii.size());      
          
    for(i = 0;i < solutii.size();i++)
    {
          fprintf(out,"\n");
          for(j = 0;j < solutii[i].size();j++)
              fprintf(out,"%d ",solutii[i][j]);      
    }

    fclose(out);
    return 1;
}