Cod sursa(job #2401010)

Utilizator NaritaandreiCNAINarita Andrei NaritaandreiCNAI Data 9 aprilie 2019 12:46:27
Problema Obiective Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.22 kb
#include <stdio.h>
#include <iostream>
#include <vector>//poate tre dublat arborele ca ii orientat
using namespace std; // pos suprascrie v cu v3
FILE *f,*g;
struct graph1
{
    int node,next,cost;
}v3[64002];
struct graph
{
    int node,next;
}v[32002],v2[32002];
struct sani
{
    int node, ind;
};
vector <sani> t[32002];
int start[32002],start2[32002],start3[64002],been[32002],st[32002],sol[100002],cost[32002];
int n,m,cate,p;
void read()
{   int x,y,k=0;
    fscanf(f,"%d %d",&n,&m);
    for(int i=1; i<=m; i++)
    {
        fscanf(f,"%d %d",&x,&y);
        v[++k].node=y;
        v[k].next=start[x];
        start[x]=k;

        v2[k].node=x;
        v2[k].next=start2[y];
        start2[y]=k;
    }
}
void dfs(int nod)
{
    been[nod]=1;
    for(int i=start[nod]; i;i=v[i].next)
        if(!been[v[i].node])
            dfs(v[i].node);
    st[++st[0]]=nod;
}
void dfst(int nod)
{
    been[nod]=1;
    for(int i=start2[nod]; i;i=v2[i].next)
        if(!been[v2[i].node])
            dfst(v2[i].node);
    been[nod]=cate;
}
void tare_conexe()
{
    for(int i=1; i<=n; i++)
        if(!been[i])
            dfs(i);
    for(int i=1; i<=n;i++)
        been[i]=0;
    for(int i=n; i>=1; i--)
        if(!been[st[i]])
        {
            cate++;
            dfst(st[i]);
        }
}
void gen_arb()
{   int k=0;
    for(int i=1; i<=n; i++)
    {
        for(int j=start[i]; j; j=v[j].next)
        {
            if(been[i]!=been[v[j].node])
            {
                v3[++k].node=been[v[j].node];
                v3[k].next=start3[been[i]];
                start3[been[i]]=k;

                v3[++k].node=been[i];
                v3[k].next=start3[been[v[j].node]];
                start3[been[v[j].node]]=k;
                v3[k].cost=1;
            }
        }
    }
}
void bellman_ford(int nod)
{   int pi,ps,x;
    cost[nod]=0;
    st[pi=ps=1]=nod;
    while(ps<=pi)
    {
        x=st[ps];
        for(int i=start3[x]; i;i=v3[i].next)
        {
            if(cost[v3[i].node]>cost[x]+v3[i].cost)
            {
                cost[v3[i].node]=cost[x]+v3[i].cost;
                st[++pi]=v3[i].node;
            }
        }
        ps++;
    }
}
void solve()
{   int x,y;
    tare_conexe();
    gen_arb();
                               /* for(int i=1;i<=cate; i++,fprintf(g,"\n"))
                                    for(int j=start3[i]; j; j=v3[j].next)
                                        fprintf(g,"%d ",v3[j].node);*/

    fscanf(f,"%d",&p);
    for(int i=1;i<=p;i++)
    {
        fscanf(f,"%d %d",&x,&y);
        t[been[x]].push_back({been[y],i});
    }
    for(int j=1; j<=n; j++)
        cost[j]=999999;
    for(int i=1;i<=cate;i++)
    {
        if((x=t[i].size())>0)
        {
            bellman_ford(i);
            for(int j=0; j<x; j++)
                sol[t[i][j].ind]=cost[t[i][j].node];
            for(int j=1; j<=n; j++)
                cost[j]=9999999;
        }
    }
}
void write()
{
    for(int i=1; i<=p; i++)
        fprintf(g,"%d\n",sol[i]);
}
int main()
{
    f=fopen("obiective.in","r");
    g=fopen("obiective.out","w");
    read();
    solve();
    write();
    fclose(f);
    fclose(g);
    return 0;
}