Pagini recente » Cod sursa (job #556375) | Cod sursa (job #1628442) | Cod sursa (job #2714550) | Cod sursa (job #2338632) | Cod sursa (job #373650)
Cod sursa(job #373650)
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define PB push_back
#define MKP make_pair
#define FOR(i,a,b)for(int i=(a);i<=(b);++i)
#define NM 32005
#define TM 100005
#define INF 1000000
vector <pair<int,int> > G[NM];
vector <pair<pair<int,int>,int> >Q;
int N,M,T,ANS[TM],DMIN[NM];
char IN[NM];
queue<int> QQ;
void baga_blf(int sursa)
{
FOR(i,1,N)
{
DMIN[i]=INF;
IN[i]=0;
}
QQ.push(sursa);
IN[sursa]=1;
DMIN[sursa]=0;
while(!QQ.empty())
{
int nod=QQ.front();
QQ.pop();
IN[nod]=0;
FOR(i,0,G[nod].size()-1)
{
int nnod=G[nod][i].first;
int cost=G[nod][i].second;
if(DMIN[nnod]>DMIN[nod]+cost)
{
DMIN[nnod]=DMIN[nod]+cost;
if(!IN[nnod])
{
QQ.push(nnod);
IN[nnod]=1;
}
}
}
}
}
int main()
{
int a,b;
freopen("obiective.in","r",stdin);
freopen("obiective.out","w",stdout);
scanf("%d %d",&N,&M);
FOR(i,1,M)
{
scanf("%d %d",&a,&b);
G[a].PB(MKP(b,0));
G[b].PB(MKP(a,1));
}
scanf("%d",&T);
FOR(i,1,T)
{
scanf("%d %d",&a,&b);
Q.PB(MKP(MKP(a,b),i));
}
sort(Q.begin(),Q.end());
int act=0;
FOR(i,0,T-1)
{
int sursa=Q[i].first.first;
int dest=Q[i].first.second;
int care=Q[i].second;
if(sursa!=act)
{
baga_blf(sursa);
act=sursa;
}
ANS[care]=DMIN[dest];
}
FOR(i,1,T)
printf("%d\n",ANS[i]);
return 0;
}