Cod sursa(job #373650)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 14 decembrie 2009 17:34:48
Problema Obiective Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

#define PB push_back
#define MKP make_pair
#define FOR(i,a,b)for(int i=(a);i<=(b);++i)
#define NM 32005
#define TM 100005
#define INF 1000000

vector <pair<int,int> > G[NM];
vector <pair<pair<int,int>,int> >Q;

int N,M,T,ANS[TM],DMIN[NM];

char IN[NM];

queue<int> QQ;

void baga_blf(int sursa)
{
     FOR(i,1,N)
     {
       DMIN[i]=INF;
       IN[i]=0;
     }
     
     QQ.push(sursa);
     IN[sursa]=1;
     DMIN[sursa]=0;
     
     while(!QQ.empty())
     {
       int nod=QQ.front();
       QQ.pop();
       IN[nod]=0;
       
       FOR(i,0,G[nod].size()-1)
       {
         int nnod=G[nod][i].first;
         int cost=G[nod][i].second;
         
         if(DMIN[nnod]>DMIN[nod]+cost)
         {
           DMIN[nnod]=DMIN[nod]+cost;
           if(!IN[nnod])
           {
             QQ.push(nnod);
             IN[nnod]=1;
           }
         }
       }
     }
}

int main()
{
    int a,b;
    
    freopen("obiective.in","r",stdin);
    freopen("obiective.out","w",stdout);
    
    scanf("%d %d",&N,&M);
    
    FOR(i,1,M)
    {
      scanf("%d %d",&a,&b);
      
      G[a].PB(MKP(b,0));
      G[b].PB(MKP(a,1));
    }
    
    scanf("%d",&T);
    
    FOR(i,1,T)
    {
      scanf("%d %d",&a,&b);
      
      Q.PB(MKP(MKP(a,b),i));
    }
    
    sort(Q.begin(),Q.end());
    
    int act=0;
    
    FOR(i,0,T-1)
    {
      int sursa=Q[i].first.first;
      int dest=Q[i].first.second;
      int care=Q[i].second;
      
      if(sursa!=act)
      {
        baga_blf(sursa);
        act=sursa;
      }
      
      ANS[care]=DMIN[dest];
    }
    
    FOR(i,1,T)
       printf("%d\n",ANS[i]);
    
    return 0;
}