Cod sursa(job #1773371)

Utilizator zertixMaradin Octavian zertix Data 7 octombrie 2016 19:35:01
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.18 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;

int n,m,x,y,c,dist[10005],q,viz[10005],tata[10005];
vector <pair <int ,int > > v[10005];

vector < pair <int ,int > > l,gf[10005];

priority_queue < pair <int  , int  > >coada;
void citire()
{
    scanf("%d%d%d",&n,&m,&q);
    for (int i=1;i<=m;++i)
        {
            scanf("%d%d%d",&x,&y,&c);
            v[x].push_back(make_pair(y,c));
            v[y].push_back(make_pair(x,c));
        }
}
int dfs(int nod,int nodf,int &maxc)
{
    viz[nod]=1;
    if (nodf==nod)
        return 1;
    for (vector <pair <int ,int > >:: iterator it=gf[nod].begin();it!=gf[nod].end();++it)
        {
            if (!viz[it->first])
                if (dfs(it->first,nodf,maxc))
                {
                    if (maxc<it->second)
                            maxc=it->second;


                return 1;
                }
        }
    viz[nod]=0;
    return 0;
}
void apm()
{
    for (vector <pair <int ,int > > :: iterator it=v[1].begin();it!=v[1].end();++it)
    {
        coada.push(make_pair(-it->second,it->first));
        tata[it->first]=1;
    }
    dist[1]=-1;
    while (!coada.empty())
    {
        int nod2=coada.top().second;
        int nod=tata[nod2];
        if (dist[nod2])
            {
                 coada.pop();continue;
            }
        int cost=-coada.top().first;
        dist[nod2]=cost;
        gf[nod2].push_back(make_pair(nod,cost));
        gf[nod].push_back(make_pair(nod2,cost));
        coada.pop();
        for (vector <pair <int ,int > >:: iterator it=v[nod2].begin();it!=v[nod2].end();++it)
            if (!dist[it->first] && it->first!=1)
                {
                    coada.push(make_pair(-it->second,it->first));
                    tata[it->first]=nod2;
                }
    }
}
int main()
{
    freopen("apm2.in","r",stdin);
    freopen("apm2.out","w",stdout);
    citire();
    apm();
    for (int i=1;i<=q;++i)
    {
        scanf("%d%d",&x,&y);
        int maxc=0;
        memset(viz,0,sizeof(viz));
        dfs(x,y,maxc);
        printf("%d\n",maxc-1);
    }
    return 0;
}