Pagini recente » Cod sursa (job #1434122) | Cod sursa (job #2231424) | Cod sursa (job #2664306) | Cod sursa (job #2585622) | Cod sursa (job #432438)
Cod sursa(job #432438)
#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;
}