Pagini recente » Cod sursa (job #3240094) | Cod sursa (job #1085900) | Cod sursa (job #2426141)
#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#define Inf 40001
using namespace std;
vector<vector<int> > Graph(32001);
int N, M, T, i, j, k;
char C[20];
///CTC
bool Check[32001], InS[32001];
stack<int> S;
pair<int, int> P[32001], List[64001]; int V, VP, Group[32001];
///CTC
///Dijkstra
vector<vector<pair<int, int> > > GraphCTC(32001);
int Dist[32001];
struct comp{
bool operator()(int x, int y){
if(Dist[x]>=Dist[y]) return 1;
return 0;
}
};
priority_queue<int, vector<int>, comp> Q; ///lucrez cu Dist[Q]
bool InQ[32001];
///Dijkstra
void Read();
void CTC();
void Tarjan(int i);
void Dijkstra(int a, int b);
int Parse();
int main()
{
freopen("obiective.in", "r", stdin);
freopen("obiective.out", "w", stdout);
Read();
CTC();
fgets(C, 20, stdin); k=-1;
T=Parse();
for(i=1; i<=T; ++i){
int a, b;
fgets(C, 20, stdin); k=-1;
a=Parse(); b=Parse();
Dijkstra(Group[a], Group[b]);
}
return 0;
}
void Read(){
fgets(C, 20, stdin); k=-1;
N=Parse(); M=Parse();
for(i=1; i<=N; ++i) Graph[i].push_back(0);
for(i=1; i<=M; ++i){
int x, y;
fgets(C, 20, stdin); k=-1;
x=Parse(); y=Parse();
++Graph[x][0];
Graph[x].push_back(y);
List[i]=make_pair(x, y);
}
return;
}
void CTC(){
for(i=1; i<=N; ++i) if(Check[i]==false) Tarjan(i);
for(i=1; i<=V; ++i) GraphCTC[i].push_back(make_pair(0, 0));
for(i=1; i<=M; ++i) if(Group[List[i].first]!=Group[List[i].second]){
++GraphCTC[Group[List[i].first]][0].first;
GraphCTC[Group[List[i].first]].push_back(make_pair(Group[List[i].second], 0));
++GraphCTC[Group[List[i].second]][0].first;
GraphCTC[Group[List[i].second]].push_back(make_pair(Group[List[i].first], 1));
}
return;
}
void Tarjan(int i){
int j;
Check[i]=InS[i]=true;
S.push(i);
P[i].first=P[i].second=++VP;
for(j=1; j<=Graph[i][0]; ++j){
if(Check[Graph[i][j]]==false){
Tarjan(Graph[i][j]);
P[i].second=min(P[i].second, P[Graph[i][j]].second);
}
else if(InS[Graph[i][j]]==true) P[i].second=min(P[i].second, P[Graph[i][j]].first);
}
if(P[i].first==P[i].second){
++V;
while(S.top()!=i){
InS[S.top()]=false;
Group[S.top()]=V;
S.pop();
}
InS[S.top()]=false;
Group[S.top()]=V;
S.pop();
}
return;
}
void Dijkstra(int a, int b){
int j;
for(j=1; j<=V; ++j) {InQ[j]=false; Dist[j]=Inf;}
Dist[a]=0; InQ[a]=true;
Q.push(a);
while(!Q.empty()){
while(!Q.empty() && InQ[Q.top()]==false) Q.pop();
if(Q.size()==0) break;
int i=Q.top(); InQ[Q.top()]=false; Q.pop();
for(j=1; j<=GraphCTC[i][0].first; ++j){
if(Dist[i]+GraphCTC[i][j].second<Dist[GraphCTC[i][j].first]){
Dist[GraphCTC[i][j].first]=Dist[i]+GraphCTC[i][j].second;
Q.push(GraphCTC[i][j].first);
if(InQ[GraphCTC[i][j].first]==false) InQ[GraphCTC[i][j].first]=true;
}
}
}
printf("%d\n", Dist[b]);
}
int Parse(){
++k; while(C[k]==' ') ++k;
int nr=0;
while(C[k]!=' ' && C[k]!='\n'){nr=nr*10+(C[k]-'0'); ++k;}
return nr;
}