Cod sursa(job #432438)

Utilizator otilia_sOtilia Stretcu otilia_s Data 2 aprilie 2010 13:01:19
Problema Matrice 2 Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
#define NMAX 90004
int H[NMAX],d[NMAX],poz[NMAX],a[NMAX];
vector <int> A[NMAX];
int n,nh;

void upheap(int k)
{
	int val=H[k];
	while (k>1 && d[val]>d[H[k>>1]])
	{
		H[k]=H[k>>1]; poz[H[k]]=k;
		k>>=1;
	}
	H[k]=val; poz[val]=k;
}

void downheap(int k)
{
	int fiu;
	do
	{
		fiu=0;
		if ((k<<1)<=nh) 
			{
				fiu=k<<1;
				if (fiu<nh && d[H[fiu+1]]>d[H[fiu]]) ++fiu;
				if (d[H[k]]<d[H[fiu]])
					{
						int aux=H[k]; H[k]=H[fiu]; H[fiu]=aux;
						poz[H[k]]=k; poz[H[fiu]]=fiu;
						k=fiu;
					}
				else fiu=0;				
		    }
	}
	while (fiu);
}

int dijkstra(int p1, int p2)
{
	int i;
	memset(d,0,sizeof(d));		
	H[1]=p1; poz[p1]=1; d[p1]=a[p1]; 
	
	for (nh=1; nh;)
	{
		int v=H[1]; H[1]=H[nh--]; poz[H[1]]=1; downheap(1);	
		if (v==p2) break;
			
		for (i=0;i<A[v].size();++i)
		{
		 int y=A[v][i];
		 if ( min(d[v],a[y])>d[y] || !d[y])
		 {
			if (!d[y]) { H[++nh]=y; poz[y]=nh; }
			d[y]=min(d[v],a[y]);
			upheap(poz[y]);
		 }
		}
	}
	
	return d[p2];
}

inline int ind(int x, int y)
{
	return (x-1)*n+y;
}

int main()
{
  ifstream fin("matrice2.in");
  ofstream fout("matrice2.out");
  int q,i,j,k;
  
  fin>>n>>q;
  for (i=1;i<=n;++i) 
	for (j=1;j<=n;++j)
	{ int v;
		fin>>v;
		a[++k]=v;
		if (j>1) A[k].push_back(k-1);
		if (j<n) A[k].push_back(k+1);
		if (i>1) A[k].push_back( ind(i-1,j) );
		if (i<n) A[k].push_back( ind(i+1,j) );		
	}
  
  int x1,y1,x2,y2;
  while (q--)
  {
	fin>>x1>>y1>>x2>>y2;
	fout<<dijkstra( ind(x1,y1) , ind(x2,y2))<<"\n";
  }
  
  return 0;	
}