Cod sursa(job #2500056)

Utilizator rd211Dinucu David rd211 Data 27 noiembrie 2019 10:35:57
Problema Obiective Scor 35
Compilator cpp-64 Status done
Runda guritza Marime 3.71 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("obiective.in");
ofstream fout("obiective.out");
int n,m;
const int NMAX = 32010;
vector<pair<int,bool>> graf[NMAX];
int D[NMAX];
bool inCue[NMAX];
struct compare{
    bool operator()(int a, int b)
    {
        return D[a]>=D[b];
    }
};
int representativeGroup[NMAX];
vector<vector<pair<int,bool>>> graf2;
void dijkstra(int start)
{

    priority_queue<int,vector<int>,compare> cue;
    start = representativeGroup[start];
    cue.push(start);
    inCue[start] = true;
    fill(D,D+NMAX,1231123);
    D[start] = 0;
    while(cue.size())
    {
        int cueTop = cue.top();
        inCue[cueTop] = false;
        cue.pop();
        for(int i = 0;i<graf2[cueTop].size();i++)
        {
            if(D[representativeGroup[graf2[cueTop][i].first]]>D[cueTop]+graf2[cueTop][i].second)
            {
                  D[representativeGroup[graf2[cueTop][i].first]] = D[cueTop]+graf2[cueTop][i].second;
                  if(!inCue[representativeGroup[graf2[cueTop][i].first]])
                  {
                      inCue[representativeGroup[graf2[cueTop][i].first]] = true;
                      cue.push(representativeGroup[ graf2[cueTop][i].first]);
                  }
            }
        }
    }
}
int viz[NMAX];
void dfsPlus(int start)
{
    queue<int> cue;
    cue.push(start);
    viz[start] = start;
    while(cue.size())
    {
        for(int i = 0;i<graf[cue.front()].size();i++)
        {
            if(viz[graf[cue.front()][i].first]!=start && !graf[cue.front()][i].second)
            {
                viz[graf[cue.front()][i].first] = start;
                cue.push(graf[cue.front()][i].first);
            }
        }
        cue.pop();
    }
}

void dfsMinus(int start)
{
    vector<int> connectedNodes;
    vector<pair<int,bool>> newNode;
    queue<int> cue;
    cue.push(start);
    viz[start] = -start;
    connectedNodes.push_back(start);
    representativeGroup[start] = graf2.size();
    while(cue.size())
    {
        for(int i = 0;i<graf[cue.front()].size();i++)
        {
            if(viz[graf[cue.front()][i].first]!=-999999 &&viz[graf[cue.front()][i].first]!=-start  && graf[cue.front()][i].second)
            {
                if(viz[graf[cue.front()][i].first]==start)
                {
                    connectedNodes.push_back(graf[cue.front()][i].first);
                    representativeGroup[graf[cue.front()][i].first] = graf2.size();
                    viz[graf[cue.front()][i].first] = -start;

                }
                else{
                    viz[graf[cue.front()][i].first] = -999999;
                }
                cue.push(graf[cue.front()][i].first);
            }
        }
        cue.pop();
    }
    for(int i = 0;i<connectedNodes.size();i++)
    {
        for(int j = 0;j<graf[connectedNodes[i]].size();j++)
        {
            if(viz[graf[connectedNodes[i]][j].first] != -start)
            {
                newNode.push_back({graf[connectedNodes[i]][j].first,graf[connectedNodes[i]][j].second});
            }
        }
    }
    graf2.push_back(newNode);
}
int main()
{
    fin>>n>>m;
    for(int i = 0;i<m;i++)
    {
        int u,v;
        fin>>u>>v;
        graf[u].push_back({v,false});
        graf[v].push_back({u,true});
    }
    fill(viz,viz+NMAX,-99999999);
    for(int i = 1;i<=n;i++)
    {
        if(viz[i]== -999999 ||viz[i]==-99999999|| viz[i] >= 0)
        {
            dfsPlus(i);
            dfsMinus(i);
        }
    }

    int t;
    fin>>t;
    while(t--)
    {
        int g,p;
        fin>>g>>p;
        dijkstra(g);
        fout<<D[representativeGroup[p]]<<'\n';
    }
    return 0;
}