Cod sursa(job #374375)

Utilizator titusuTitus C titusu Data 16 decembrie 2009 22:06:42
Problema Strazi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
using namespace std;
#include <fstream>
int a[256][256], v[256],t[256],level[256],n;
struct nod{
	int info;
	nod* next;
};

int ad[256][2],nrad;

void DFS(int k,int l){
	level[k]=l;
	for(int i=1;i<=n;i++){
		if(v[i]==0 && level[i]==-1 && a[k][i]==1){
			t[i]=k;
			DFS(i,l+1);
		}
	}
}

int main(){
	ifstream fin("strazi.in");
	int m,i,j;
	fin>>n>>m;
	for( ; m ; --m){
		fin>>i>>j;
		a[i][j]=1;
	}
	nod * prim=NULL;
	
	for(i=1;i<=n;i++)
		if(v[i]==0){
			for(j=1;j<=n;j++){
				t[j]=-1;
				if(v[j]==0)
					level[j]=-1;
				else
					level[j]=0;
			}
			t[i]=0;
			DFS(i,0);
			int poz=1;
			for(j=1;j<=n;j++)
				if(level[j]>level[poz])
					poz=j;
			if(level[poz]==0)
				poz=i;
			if(prim){
				nrad++;
				ad[nrad][0]=poz;
				ad[nrad][1]=prim->info;
			}
			while(poz){
				v[poz]=1;
				nod *pp=new nod;
				pp->info=poz;
				pp->next=prim;
				prim=pp;
				poz=t[poz];
			}
			
		}
	ofstream fout("strazi.out");
	fout<<nrad<<endl;
	for(i=1;i<=nrad;++i)
		fout<<ad[i][0]<<" "<<ad[i][1]<<endl;
	while(prim){
		fout<<prim->info<<" ";
		prim=prim->next;
	}
	return 0;
}