Pagini recente » Cod sursa (job #1993481) | Cod sursa (job #162194) | Cod sursa (job #457889) | Cod sursa (job #571996) | Cod sursa (job #2500065)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("obiective.in");
ofstream fout("obiective.out");
int n,m;
const int NMAX = 32010;
vector<pair<int,bool>> graf[NMAX];
int D[NMAX];
bool inCue[NMAX];
struct compare{
bool operator()(int a, int b)
{
return D[a]>=D[b];
}
};
int representativeGroup[NMAX];
vector<vector<pair<int,bool>>> graf2;
void dijkstra(int start)
{
priority_queue<int,vector<int>,compare> cue;
start = representativeGroup[start];
cue.push(start);
inCue[start] = true;
fill(D,D+graf2.size()+10,12311123);
D[start] = 0;
while(cue.size())
{
int cueTop = cue.top();
inCue[cueTop] = false;
cue.pop();
for(int i = 0;i<graf2[cueTop].size();i++)
{
if(D[representativeGroup[graf2[cueTop][i].first]]>D[cueTop]+graf2[cueTop][i].second)
{
D[representativeGroup[graf2[cueTop][i].first]] = D[cueTop]+graf2[cueTop][i].second;
if(!inCue[representativeGroup[graf2[cueTop][i].first]])
{
inCue[representativeGroup[graf2[cueTop][i].first]] = true;
cue.push(representativeGroup[ graf2[cueTop][i].first]);
}
}
}
}
}
int viz[NMAX];
void dfsPlus(int start)
{
queue<int> cue;
cue.push(start);
viz[start] = start;
while(cue.size())
{
for(int i = 0;i<graf[cue.front()].size();i++)
{
if(viz[graf[cue.front()][i].first]!=start && !graf[cue.front()][i].second)
{
viz[graf[cue.front()][i].first] = start;
cue.push(graf[cue.front()][i].first);
}
}
cue.pop();
}
}
void dfsMinus(int start)
{
vector<int> connectedNodes;
vector<pair<int,bool>> newNode;
queue<int> cue;
cue.push(start);
viz[start] = -start;
connectedNodes.push_back(start);
representativeGroup[start] = graf2.size();
while(cue.size())
{
for(int i = 0;i<graf[cue.front()].size();i++)
{
if(viz[graf[cue.front()][i].first]!=-999999 &&viz[graf[cue.front()][i].first]!=-start && graf[cue.front()][i].second)
{
if(viz[graf[cue.front()][i].first]==start)
{
connectedNodes.push_back(graf[cue.front()][i].first);
representativeGroup[graf[cue.front()][i].first] = graf2.size();
viz[graf[cue.front()][i].first] = -start;
}
else{
viz[graf[cue.front()][i].first] = -999999;
}
cue.push(graf[cue.front()][i].first);
}
}
cue.pop();
}
for(int i = 0;i<connectedNodes.size();i++)
{
for(int j = 0;j<graf[connectedNodes[i]].size();j++)
{
if(viz[graf[connectedNodes[i]][j].first] != -start)
{
newNode.push_back({graf[connectedNodes[i]][j].first,graf[connectedNodes[i]][j].second});
}
}
}
graf2.push_back(newNode);
}
int main()
{
fin>>n>>m;
for(int i = 0;i<m;i++)
{
int u,v;
fin>>u>>v;
graf[u].push_back({v,false});
graf[v].push_back({u,true});
}
for(int i = 1;i<=n;i++)
{
if(viz[i]== -999999 ||viz[i]==-99999999|| viz[i] >= 0)
{
dfsPlus(i);
dfsMinus(i);
}
}
int t;
fin>>t;
while(t--)
{
int g,p;
fin>>g>>p;
dijkstra(g);
fout<<D[representativeGroup[p]]<<'\n';
}
return 0;
}