Pagini recente » Cod sursa (job #2025402) | Cod sursa (job #2172325) | Cod sursa (job #1709163) | Cod sursa (job #2645009) | Cod sursa (job #67752)
Cod sursa(job #67752)
#include<cstdio>
#define NMAX 32001
#define INF 33000
struct NOD {int x,c; NOD *adr;};
int N;
NOD *prim[NMAX];
int cost[NMAX],vizitat[NMAX];
short int C[1000][1000];
void adaug_st(NOD *(&prim), int x , int cost)
{
NOD *a=new NOD;
a->x=x;
a->c=cost;
a->adr=prim;
prim=a;
}
void read_data()
{
int m,u,v;
scanf("%d %d",&N,&m);
for(int i=1;i<=N;i++)
prim[i]=NULL;
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
C[i][j]=INF;
for(int i=0;i<m;i++)
{
scanf("%d %d",&u,&v);
C[u][v]=0;
C[v][u]=1;
adaug_st(prim[u],v,0);
adaug_st(prim[v],u,1);
}
}
int djk(int u, int v)
{
int i;
for(i=1;i<=N;i++)
{cost[i]=INF;
vizitat[i]=0;}
NOD *b=prim[u];
while(b)
{
cost[b->x]=b->c;
b=b->adr;
}
vizitat[u]=1;
for(int j=0;j<N-1;j++)
{
int min=INF,poz=-1;
for(i=1;i<=N;i++)
if(!vizitat[i] && min>cost[i])
{
min=cost[i];
poz=i;
}
if(poz==v)
return cost[v];
vizitat[poz]=1;
NOD *b=prim[poz];
while(b)
{
if(cost[b->x]>min+C[poz][b->x])
cost[b->x]=min+C[poz][b->x];
b=b->adr;
}
}
return cost[v];
}
int main()
{
freopen("obiective.in","r",stdin);
freopen("obiective.out","w",stdout);
read_data();
int t;
scanf("%d",&t);
for(int i=0;i<t;i++)
{
int u,v;
scanf("%d %d",&u,&v);
printf("%d\n",djk(u,v));
}
return 0;
}