Cod sursa(job #7283)

Utilizator victorsbVictor Rusu victorsb Data 21 ianuarie 2007 13:18:47
Problema Radiatie Scor 10
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasele 11-12 Marime 2.34 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define Nmax 15010
#define Mmax 30010
#define pb push_back
#define sz(a) int((a).size())
#define nd first
#define cst second

using namespace std;

int n, m, k, i, j, st, dr, mij, ct, a, b, c;
int viz[Nmax];
vector< pair<int,int> > lv[Nmax];
int cs[Nmax],cd[Nmax],sol[Nmax];
int x[Nmax], y[Nmax];
int cost[Mmax];

void citire()
{
    scanf("%d %d %d\n", &n, &m, &k);
    for (i=1; i<=m; ++i)
    {
        scanf("%d %d %d\n", &a, &b, &c);
        lv[a].pb(make_pair(b,c));
        lv[b].pb(make_pair(a,c));
        cost[i] = c;
    }
    for (i=1; i<=k; ++i)
        scanf("%d %d\n", &x[i], &y[i]);
}

void df(int nod)
{
    int i;
    viz[nod] = ct;
    for (i=0; i<sz(lv[nod]); ++i)
        if (!(viz[lv[nod][i].nd]) && lv[nod][i].cst <= cost[mij])
            df(lv[nod][i].nd);
}

void solve()
{
    sort(cost+1, cost+m+1);
    for (i=1; i<=k; ++i)
    {
        cs[i] = 1;
        cd[i] = m;
    }
    for (i=1; i<=k; ++i)
    {
        st = cs[i];
        dr = cd[i];
        if (st == dr)
           sol[i] = st;
        else
        {
            while (st <= dr)
            {
                mij = (st + dr) >> 1;
                memset(viz,0,sizeof(viz));
                ct = 0;
                for (j=1; j<=n; ++j)
                    if (!viz[j])
                    {
                        ++ct;
                        df(j);
                    }
                for (j=i; j<=k; ++j)
                    if (viz[x[j]] == viz[y[j]])
                    {
                        if (cd[j] >= mij)
                        {
                            cd[j] = mij - 1;
                            sol[j] = mij;
                        }
                    }
                    else
                        if (cs[j] <= mij)
                            cs[j] = mij + 1;

                if (viz[x[i]] == viz[y[i]])
                {
                    sol[i] = mij;
                    dr = mij - 1;
                }
                else
                    st = mij + 1;
            }
        }
        
    }
    for (i=1; i<=k; ++i)
        printf("%d\n", cost[sol[i]]);
}

int main()
{
    freopen("radiatie.in","r",stdin);
    freopen("radiatie.out","w",stdout);
    citire();
    solve();
    return 0;
}