Cod sursa(job #361043)

Utilizator MihaiGmihaig MihaiG Data 3 noiembrie 2009 16:08:31
Problema Subsecventa de suma maxima Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#define nmax 50005
using namespace std;
FILE*f=fopen("retele.in","r");
FILE*g=fopen("retele.out","w");
int viz[nmax],postord[nmax],ordineafis[2][nmax],n,m,nr;
vector <int> graf[nmax],graft[nmax],solutie[nmax];

void citire(){
	int nod,nod2;
	fscanf(f,"%d %d",&n,&m);
	for(int i=0;i<m;i++){
		fscanf(f,"%d %d",&nod,&nod2);
		graf[nod].push_back(nod2);
		graft[nod2].push_back(nod);
	}
}

void dfs(int x){
	viz[x]=1;
	for(int i=0;i<graf[x].size();i++){
		if(!viz[graf[x][i]]){
			dfs(graf[x][i]);
		}
	}
	postord[++nr]=x;
}

void dfst(int x){
	viz[x]=0;
	solutie[nr].push_back(x);
	for(int i=0;i<graft[x].size();i++){
		if(viz[graft[x][i]]){
			dfst(graft[x][i]);
		}
	}
}



void ctc(){
	int i;
	for(i=1;i<=n;i++){
		if(!viz[i]){
			dfs(i);
		}
	}
	nr=0;
	for(i=n;i>0;i--){
		if(viz[postord[i]]){
			++nr;
			dfst(postord[i]);
		}
	}
}

int comparare(vector <int> a,vector <int> b){
	return a[0]<b[0];
}

void sortare(){
	int i;
	for(i=1;i<=nr;i++){
		sort(solutie[i].begin(),solutie[i].end());
	}
	sort(solutie+1,solutie+nr+1,comparare);
	
}

void afis(){
	int i,j;
	fprintf(g,"%d\n",nr);
	for(i=1;i<=nr;i++){
		fprintf(g,"%d ",solutie[i].size());
		for(j=0;j<solutie[i].size();j++){
			fprintf(g,"%d ",solutie[i][j]);
		}
		fprintf(g,"\n");
	}
}

int main(){
	
	citire();
	ctc();
	sortare();
	afis();
	
	fclose(f);
	fclose(g);
	return 0;
}