Pagini recente » Cod sursa (job #660427) | Cod sursa (job #2714629) | Cod sursa (job #2309140) | Cod sursa (job #506663) | Cod sursa (job #2401010)
#include <stdio.h>
#include <iostream>
#include <vector>//poate tre dublat arborele ca ii orientat
using namespace std; // pos suprascrie v cu v3
FILE *f,*g;
struct graph1
{
int node,next,cost;
}v3[64002];
struct graph
{
int node,next;
}v[32002],v2[32002];
struct sani
{
int node, ind;
};
vector <sani> t[32002];
int start[32002],start2[32002],start3[64002],been[32002],st[32002],sol[100002],cost[32002];
int n,m,cate,p;
void read()
{ int x,y,k=0;
fscanf(f,"%d %d",&n,&m);
for(int i=1; i<=m; i++)
{
fscanf(f,"%d %d",&x,&y);
v[++k].node=y;
v[k].next=start[x];
start[x]=k;
v2[k].node=x;
v2[k].next=start2[y];
start2[y]=k;
}
}
void dfs(int nod)
{
been[nod]=1;
for(int i=start[nod]; i;i=v[i].next)
if(!been[v[i].node])
dfs(v[i].node);
st[++st[0]]=nod;
}
void dfst(int nod)
{
been[nod]=1;
for(int i=start2[nod]; i;i=v2[i].next)
if(!been[v2[i].node])
dfst(v2[i].node);
been[nod]=cate;
}
void tare_conexe()
{
for(int i=1; i<=n; i++)
if(!been[i])
dfs(i);
for(int i=1; i<=n;i++)
been[i]=0;
for(int i=n; i>=1; i--)
if(!been[st[i]])
{
cate++;
dfst(st[i]);
}
}
void gen_arb()
{ int k=0;
for(int i=1; i<=n; i++)
{
for(int j=start[i]; j; j=v[j].next)
{
if(been[i]!=been[v[j].node])
{
v3[++k].node=been[v[j].node];
v3[k].next=start3[been[i]];
start3[been[i]]=k;
v3[++k].node=been[i];
v3[k].next=start3[been[v[j].node]];
start3[been[v[j].node]]=k;
v3[k].cost=1;
}
}
}
}
void bellman_ford(int nod)
{ int pi,ps,x;
cost[nod]=0;
st[pi=ps=1]=nod;
while(ps<=pi)
{
x=st[ps];
for(int i=start3[x]; i;i=v3[i].next)
{
if(cost[v3[i].node]>cost[x]+v3[i].cost)
{
cost[v3[i].node]=cost[x]+v3[i].cost;
st[++pi]=v3[i].node;
}
}
ps++;
}
}
void solve()
{ int x,y;
tare_conexe();
gen_arb();
/* for(int i=1;i<=cate; i++,fprintf(g,"\n"))
for(int j=start3[i]; j; j=v3[j].next)
fprintf(g,"%d ",v3[j].node);*/
fscanf(f,"%d",&p);
for(int i=1;i<=p;i++)
{
fscanf(f,"%d %d",&x,&y);
t[been[x]].push_back({been[y],i});
}
for(int j=1; j<=n; j++)
cost[j]=999999;
for(int i=1;i<=cate;i++)
{
if((x=t[i].size())>0)
{
bellman_ford(i);
for(int j=0; j<x; j++)
sol[t[i][j].ind]=cost[t[i][j].node];
for(int j=1; j<=n; j++)
cost[j]=9999999;
}
}
}
void write()
{
for(int i=1; i<=p; i++)
fprintf(g,"%d\n",sol[i]);
}
int main()
{
f=fopen("obiective.in","r");
g=fopen("obiective.out","w");
read();
solve();
write();
fclose(f);
fclose(g);
return 0;
}