Cod sursa(job #67749)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 25 iunie 2007 13:53:58
Problema Obiective Scor 35
Compilator cpp Status done
Runda preONI 2007, Runda Finala, Clasele 11-12 Marime 2.04 kb
#include <stdio.h> 
#include <vector>

using namespace std;

#define maxn 32010
#define pb push_back
#define maxx 100010

int n,m,l,k;
vector <short> a[maxn];
vector <int> b[maxn];
vector <char> c[maxn];
int g[maxn];
short px[maxx],py[maxx],sol[maxx];
int s[maxn],v[maxn];
char used[maxn];
short cost[maxn];

void BFS(int nod)
{
     memset(used,0,sizeof(used));
     
     int i,j;
     
     for (i=1;i<=n;i++) cost[i]=maxn;
     cost[nod]=0;
     l=1;
     k=0;
     s[l]=nod;
     used[nod]=1;
     
     while (l>0)
     {
           for (i=1;i<=l;i++) 
             for (j=0;j<g[s[i]];j++)
             {
               if ((c[s[i]][j]==0) && (used[a[s[i]][j]]!=1)) 
               {
                   s[++l]=a[s[i]][j];
                   used[s[l]]=1;
                   cost[s[l]]=cost[s[i]];
               }
               if ((c[s[i]][j]==1) && (used[a[s[i]][j]]==0))
               {
                   v[++k]=a[s[i]][j];
                   used[v[k]]=2;
                   cost[v[k]]=cost[s[i]]+1;
               }
             }
             
           l=0;
           for (i=1;i<=k;i++)
             if (used[v[i]]!=1)
             {
                 s[++l]=v[i];
                 used[s[l]]=1;
             }
     }     
}

int main()
{
    freopen("obiective.in","r",stdin);
    freopen("obiective.out","w",stdout);
    
    scanf("%d %d ",&n,&m);
    
    int i,x,y,aux,j;
    
    for (i=1;i<=m;i++)
    {
        scanf("%d %d ",&x,&y);
        a[x].pb(y);
        a[y].pb(x);
        c[x].pb(0);
        c[y].pb(1);
    }
    
    for (i=1;i<=n;i++) g[i]=a[i].size();
    
    scanf("%d ",&m);
    
    for (i=1;i<=m;i++)
    {
        scanf("%d %d ",&px[i],&py[i]);
        b[px[i]].pb(i);
    }
    
    for (i=1;i<=n;i++)
    {
        aux=b[i].size();
        if (aux>0)
        {
             BFS(i);
             for (j=0;j<aux;j++) sol[b[i][j]]=cost[py[b[i][j]]];
        }
    }
    
    for (i=1;i<=m;i++) printf("%d\n",sol[i]);
    
    return 0;
}