Pagini recente » Cod sursa (job #2763209) | Cod sursa (job #2510605) | Cod sursa (job #2165679) | Cod sursa (job #2656240) | Cod sursa (job #2369017)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#define nmax 32005
using namespace std;
ifstream f("obiective.in");
ofstream g("obiective.out");
int n,m, nr, viz[nmax], cnt, cmp[nmax], d[nmax];
vector <int> v[nmax], vt[nmax];
vector <pair<int,int> > gn[nmax];
struct dist{
int x,y;
}mg[nmax];
stack <int> s;
priority_queue <pair<int,int> > pq;
void citire()
{
int i,x,y;
f>>n>>m;
for(i=1; i<=m; i++)
{
f>>x>>y;
v[x].push_back(y);
vt[y].push_back(x);
}
f>>nr;
for(i=1; i<=nr; i++)
{
f>>mg[i].x>>mg[i].y;
}
}
void adanc(int nod)
{
int i,next;
viz[nod]=1;
for(i=0; i<v[nod].size(); i++)
{
next=v[nod][i];
if(!viz[next])
adanc(next);
}
s.push(nod);
}
void adanct(int nod)
{
int i,next;
viz[nod]=0;
cmp[nod]=cnt;
for(i=0; i<vt[nod].size(); i++)
{
next=vt[nod][i];
if(viz[next])
adanct(next);
}
}
void graf_nou()
{
int i,j,k, next;
for(i=1; i<=n; i++)
for(j=0; j<v[i].size(); j++)
{
next=v[i][j];
if(cmp[i]!=cmp[next])
{
gn[cmp[i]].push_back({cmp[next],0});
gn[cmp[next]].push_back({cmp[i],1});
}
}
}
void dij(int start)
{
int i,nod,next, cost, cst;
for(i=1; i<=n; i++)
{d[i]=1e9; viz[i]=0;}
d[start]=0;
pq.push({0,start});
while(!pq.empty())
{
nod=pq.top().second;
cost=-pq.top().first;
pq.pop();
if(!viz[nod])
{
viz[nod]=1;
for(i=0; i<gn[nod].size(); i++)
{
next=gn[nod][i].first;
cst=gn[nod][i].second;
if(d[next]>d[nod]+cst)
{d[next]=d[nod]+cst; pq.push({-d[next],next});}
}
}
}
}
int main()
{
citire();
int i,j, nod;
for(i=1; i<=n; i++)
if(!viz[i])
adanc(i);
while(!s.empty())
{
nod=s.top();
s.pop();
if(viz[nod])
{
cnt++;
adanct(nod);
}
}
graf_nou();
/*for(i=1; i<=cnt; i++)
{
for(j=0; j<gn[i].size(); j++)
cout<<gn[i][j].first<<" "<<gn[i][j].second<<" ";
cout<<"\n";
}*/
for(i=1; i<=nr; i++)
{
if(cmp[mg[i].x]==cmp[mg[i].y])
{g<<0<<"\n"; continue;}
dij(cmp[mg[i].x]);
/*for(j=1; j<=cnt; j++)
cout<<d[j]<<" ";
cout<<"\n";*/
g<<d[cmp[mg[i].y]]<<"\n";
}
f.close();
g.close();
return 0;
}