Cod sursa(job #732340)

Utilizator Robert29FMI Tilica Robert Robert29 Data 10 aprilie 2012 12:00:34
Problema Cuplaj maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include<stdio.h>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
FILE*f=fopen("casute.in","r");
FILE*g=fopen("casute.out","w");
int ok,nr,j,i,n,m,x,y,w[3002];
short int sol[4500000];
char viz[3002],b[3002][6002];
vector <int> v[3002];
vector <short int> a[3002];
void dfs(int nod)
{
	
	if(!viz[nod])
	{
		a[i].push_back (nod);
		viz[nod]=1;
	}
	for(int j=0;j<v[nod].size();++j)
		dfs(v[nod][j]);
}
void Dfs(int nod,int st,int dr,int A,int B)
{
	b[i][nod]=1;
	if(st==dr)
		return ;
	int x=(st+dr)/2;
	
	int p=A;
	int u=B;
	int m;
	
	while(p<=u)
	{
		m=(p+u)/2;
		if(a[i][m]<=x)
			p=m+1;
		else
			u=m-1;
	}
	int nodst=nod<<1;
	int noddr=nodst+1;
	if(p>A)
		Dfs(nodst,st,x,A,p-1);

	if(p<=B)
		Dfs(noddr,x+1,dr,p,B);
	
}
void cauta(int nod,int st,int dr)
{
	if(!ok)
		return ;
	if(st==dr)
	{
		sol[nr]=st;
		ok=0;
	}
	int x=(st+dr)/2;
	int nodst=nod<<1;
	int noddr=nodst+1;
	
	if(b[i][nodst]&&b[j][nodst])
		cauta(nodst,st,x);
	
	if(b[i][noddr]&&b[j][noddr])
			cauta(noddr,x+1,dr);
}
int main()
{
	fscanf(f,"%d%d",&n,&m);
	for(i=1;i<=n;++i)
		fscanf(f,"%d",&w[i]);
	
	for(i=1;i<=m;++i)
	{
		fscanf(f,"%d%d",&x,&y);
		if(w[x]<w[y])
			v[x].push_back (y);
		else
			v[y].push_back (x);
	}
	
	for(i=1;i<=n;++i)
	{
		dfs(i);
		sort(a[i].begin(),a[i].end());
		memset(viz,0,sizeof(viz));
		
		Dfs(1,1,n,0,a[i].size()-1);
		
	}
	
	for(i=1;i<n;++i)
		for(j=i+1;j<=n;++j)
		{
			ok=1;
			++nr;
			cauta(1,1,n);	
		}
	
	
	
	fclose(f);
	fclose(g);
	return 0;
}