Cod sursa(job #2280925)

Utilizator tavi255Varzaru Octavian Stefan tavi255 Data 11 noiembrie 2018 12:57:14
Problema Obiective Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.23 kb
//#include <iostream>
#include <bits/stdc++.h>
using namespace std;
ifstream in("obiective.in");
ofstream out("obiective.out");
int n,m,nr,p,contor;
const int Max=32005;
vector < pair < int ,int > >gg[Max];
int d[Max],cc[Max]; bool viz[Max];
set < pair < int ,int > >c;
vector < int >g[Max],gt[Max];
stack < int >s;
void citire()
{
    in>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y;
        in>>x>>y;
        gg[x].push_back(make_pair(y,0));
        gg[y].push_back(make_pair(x,1));
        g[x].push_back(y);
        gt[y].push_back(x);
    }
}
void dfsg(int nod)
{
    viz[nod]=1;
    for(int i=0;i<g[nod].size();i++)
    {
        int vecin=g[nod][i];
        if(!viz[vecin])
            dfsg(vecin);
    }
s.push(nod);
}
void dfsgt(int nod)
{
    viz[nod]=0;
    for(int i=0;i<gt[nod].size();i++)
    {
        int vecin=gt[nod][i];
        if(viz[vecin])
            dfsgt(vecin);
    }
    cc[nod]=contor;
}
void ctc()
{
    for(int i=1;i<=n;i++)
        if(!viz[i])
            dfsg(i);
            while(!s.empty())
            {
                int vecin=s.top();
                if(viz[vecin])
                {
                    contor++;
                    dfsgt(vecin);
                }

                s.pop();
            }

}

void Dijkstra(int x,int y)
{
    while(!c.empty()) c.erase(c.begin());
   for(int i=1;i<=n;i++)
     d[i]=INT_MAX;

   d[x]=0;
   c.insert({0,x});
   while(!c.empty())
   {
       int nod=c.begin()->second;
       c.erase(c.begin());

            for(int i=0;i<gg[nod].size();i++)
          {
                int vecin=gg[nod][i].first;
                int cost=gg[nod][i].second;
                  if(d[vecin]>d[nod]+cost)
                {
                    if(d[vecin]!=INT_MAX)
                      c.erase({d[vecin],vecin});
                  d[vecin]=d[nod]+cost;
                  c.insert({d[vecin],vecin});
                }
          }


   }
   out<<d[y]<<"\n";


}
int main()
{
    citire();
      in>>p;
      ctc();
    for(int i=1;i<=p;i++)
    {
        int x,y;
        in>>x>>y;
        if(cc[x]==cc[y])
            out<<0<<"\n";
        else
        Dijkstra(x,y);


    }
    return 0;
}