Cod sursa(job #2369017)

Utilizator BiancaMariaVulsanVulsan Bianca Maria BiancaMariaVulsan Data 5 martie 2019 20:38:22
Problema Obiective Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.73 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#define nmax 32005
using namespace std;
ifstream f("obiective.in");
ofstream g("obiective.out");
int n,m, nr, viz[nmax], cnt, cmp[nmax], d[nmax];
vector <int> v[nmax], vt[nmax];
vector <pair<int,int> > gn[nmax];
struct dist{
    int x,y;
}mg[nmax];
stack <int> s;
priority_queue <pair<int,int> > pq;

void citire()
{
    int i,x,y;
    f>>n>>m;
    for(i=1; i<=m; i++)
    {
        f>>x>>y;
        v[x].push_back(y);
        vt[y].push_back(x);
    }
    f>>nr;
    for(i=1; i<=nr; i++)
    {
        f>>mg[i].x>>mg[i].y;
    }
}

void adanc(int nod)
{
    int i,next;
    viz[nod]=1;
    for(i=0; i<v[nod].size(); i++)
    {
        next=v[nod][i];
        if(!viz[next])
            adanc(next);
    }
    s.push(nod);
}

void adanct(int nod)
{
    int i,next;
    viz[nod]=0;
    cmp[nod]=cnt;
    for(i=0; i<vt[nod].size(); i++)
    {
        next=vt[nod][i];
        if(viz[next])
            adanct(next);
    }
}

void graf_nou()
{
    int i,j,k, next;
    for(i=1; i<=n; i++)
    for(j=0; j<v[i].size(); j++)
    {
        next=v[i][j];
        if(cmp[i]!=cmp[next])
        {
            gn[cmp[i]].push_back({cmp[next],0});
            gn[cmp[next]].push_back({cmp[i],1});
        }
    }
}

void dij(int start)
{
    int i,nod,next, cost, cst;
    for(i=1; i<=n; i++)
        {d[i]=1e9; viz[i]=0;}
    d[start]=0;
    pq.push({0,start});
    while(!pq.empty())
    {
        nod=pq.top().second;
        cost=-pq.top().first;
        pq.pop();
        if(!viz[nod])
        {
            viz[nod]=1;
            for(i=0; i<gn[nod].size(); i++)
            {
                next=gn[nod][i].first;
                cst=gn[nod][i].second;
                if(d[next]>d[nod]+cst)
                {d[next]=d[nod]+cst; pq.push({-d[next],next});}
            }
        }
    }
}

int main()
{
    citire();
    int i,j, nod;
    for(i=1; i<=n; i++)
        if(!viz[i])
            adanc(i);
    while(!s.empty())
    {
        nod=s.top();
        s.pop();
        if(viz[nod])
        {
            cnt++;
            adanct(nod);
        }
    }
    graf_nou();

    /*for(i=1; i<=cnt; i++)
    {
        for(j=0; j<gn[i].size(); j++)
            cout<<gn[i][j].first<<" "<<gn[i][j].second<<"   ";
        cout<<"\n";
    }*/

    for(i=1; i<=nr; i++)
    {
        if(cmp[mg[i].x]==cmp[mg[i].y])
            {g<<0<<"\n"; continue;}

        dij(cmp[mg[i].x]);
        /*for(j=1; j<=cnt; j++)
            cout<<d[j]<<" ";
        cout<<"\n";*/
        g<<d[cmp[mg[i].y]]<<"\n";
    }

    f.close();
    g.close();
    return 0;
}