Cod sursa(job #529644)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 5 februarie 2011 16:59:35
Problema Obiective Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.65 kb
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int N=260;
int Lun,NOD,ctc,q,n,m,v[N],poz[N],tati[N],fii[N],ctcon[N],X[N],Y[N],reprez[N],x[N],y[N];
bool f[N],usedY[N],usedX[N],proc[N];
vector<int> L[N],LT[N];
vector<pair<int,int> > NewG[N];
priority_queue<pair<int,int> > H;
void read()
{
    int x,y;
    freopen("obiective.in","r",stdin);
    freopen("obiective.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        if(x!=y)
        {
            bool ok=true;
            for(vector<int>::iterator it=L[x].begin();it!=L[x].end();it++)
                if(*it==y)
                    ok=false;
            if(ok)
            {
                L[x].push_back(y);
                LT[y].push_back(x);
            }
        }
    }
}
void makevec(int nod)
{
    f[nod]=true;
    for(vector<int>::iterator it=L[nod].begin();it!=L[nod].end();it++)
        if(!f[*it])
            makevec(*it);
    v[++q]=nod;
    poz[nod]=q;
}
void init()
{
    for(int i=1;i<=n;i++)
        if(!f[i])
            makevec(i);
}
void reset(bool f[N])
{
    for(int i=1;i<=n;i++)
        f[i]=false;
}
void dfs(int nod)
{
    f[poz[nod]]=true;
    for(vector<int>::iterator it=LT[nod].begin();it!=LT[nod].end();it++)
        if(!f[poz[*it]])
            dfs(*it);
    ctcon[nod]=ctc;
}
void makectc()
{
    for(int i=n;i>=1;i--)
        if(!f[i])
        {
            ctc++;
            reprez[ctc]=v[i];
            dfs(v[i]);
        }
}
void init2()
{
    for(int i=1;i<=n;i++)
        for(vector<int>::iterator it=L[i].begin();it!=L[i].end();it++)
            if(ctcon[i]!=ctcon[*it])
            {
                bool ok=true;
                for(vector<pair<int,int> >::iterator it2=NewG[ctcon[i]].begin();it2!=NewG[ctcon[i]].end();it2++)
                    if(it2->first==ctcon[i])
                    {
                        ok=false;
                        if(it2->second==1)
                            it2->second=0;
                    }
                if(ok)
                {
                    NewG[ctcon[i]].push_back(make_pair(ctcon[*it],0));
                    bool ok=true;
                    for(vector<pair<int,int> >::iterator it2=NewG[ctcon[*it]].begin();it2!=NewG[ctcon[*it]].end();it2++)
                        if(it2->first==ctcon[*it])
                            ok=false;
                    if(ok)
                        NewG[ctcon[*it]].push_back(make_pair(ctcon[i],1));
                }
            }
}
void resetdij()
{
    for(int i=1;i<=ctc;i++)
        proc[i]=false;
    while(!H.empty())
        H.pop();
}
void dijkstra(int st,int fin)
{
    H.push(make_pair(0,st));
    while(!H.empty())
    {
        pair<int,int> nod=H.top();
        H.pop();
        if(!proc[nod.second])
        {
            proc[nod.second]=true;
            if(nod.second==fin)
            {
                printf("%d\n",-nod.first);
                return;
            }
            for(vector<pair<int,int> >::iterator it=NewG[nod.second].begin();it!=NewG[nod.second].end();it++)
                if(!proc[it->first])
                    H.push(make_pair(nod.first-it->second,it->first));
        }
    }
}
void solve()
{
    int x,y,k;
    scanf("%d",&k);
    for(int i=1;i<=k;i++)
    {
        resetdij();
        scanf("%d%d",&x,&y);
        if(ctcon[x]==ctcon[y])
        {
            printf("0\n");
            continue;
        }
        dijkstra(ctcon[x],ctcon[y]);
    }
}
int main()
{
    read();
    init();
    reset(f);
    makectc();
    init2();
    solve();
    return 0;
}