Cod sursa(job #7273)

Utilizator astronomyAirinei Adrian astronomy Data 21 ianuarie 2007 13:17:36
Problema Radiatie Scor 40
Compilator c Status done
Runda preONI 2007, Runda 1, Clasele 11-12 Marime 2.34 kb
#include <stdio.h>
#include <stdlib.h>

#define MAX_N (1 << 15)
#define MAX_K (1 << 14)
#define INF (1 << 30)
#define max(a,b) ((a) > (b) ? (a) : (b))
#define swap(a,b) ((a)^=(b), (b)^=(a), (a)^=(b))

int N, M, K, Min[MAX_N], *G[MAX_N], *C[MAX_N];
int *V[MAX_N], *Ind[MAX_N];
int res[MAX_K];

int Q[1<<20];

void baga(int xs)
{
    int x, inc, sf, *p, *c, i;

    Q[inc = sf = 0] = xs;
    for(i = 1; i <= N; i++)
        Min[i] = INF;
    Min[xs] = 0;

    while(inc <= sf)
    {
        x = Q[inc++];
        for(p = G[x], c = C[x]; *p; p++, c++)
         if(max(Min[x], *c) < Min[*p])
            Min[*p] = max(Min[x], *c), Q[++sf] = *p;
    }

    for(p = V[xs], c = Ind[xs]; *p; p++, c++)
        res[*c] = Min[*p];
}

void solve(void)
{
    int i;

    for(i = 1; i <= N; i++)
     if(V[i][0] != 0)
        baga(i);
}

int deg[MAX_N], edge[1<<16][3];

void read_data(void)
{
    int i, j, u, v, c;

    scanf("%d %d %d\n", &N, &M, &K);

    for(i = 1; i <= M; i++)
        scanf("%d %d %d\n", &u, &v, &c),
        deg[u]++, deg[v]++, edge[i][0] = u, edge[i][1] = v, edge[i][2] = c;

    for(i = 1; i <= N; i++)
        G[i] = (int*) malloc(sizeof(int)*(deg[i]+2)), G[i][deg[i]] = 0,
        C[i] = (int*) malloc(sizeof(int)*(deg[i]+2)),
        deg[i] = 0;

    for(i = 1; i <= M; i++)
    {
        u = edge[i][0], v = edge[i][1], c = edge[i][2];
        G[u][deg[u]] = v, G[v][deg[v]] = u;
        C[u][deg[u]++] = c, C[v][deg[v]++] = c;
    }

    for(i = 1; i <= N; i++)
        deg[i] = 0;

    for(i = 1; i <= K; i++)
    {
        scanf("%d %d\n", &u, &v);
        if(u > v) swap(u, v);
        deg[u]++, edge[i][0] = u, edge[i][1] = v;
    }

    for(i = 1; i <= N; i++)
        V[i] = (int*) malloc(sizeof(int)*(deg[i]+2)), V[i][deg[i]] = 0,
        Ind[i] = (int*) malloc(sizeof(int)*(deg[i]+2)),
        deg[i] = 0;

    for(i = 1; i <= K; i++)
    {
        u = edge[i][0], v = edge[i][1];
        V[u][deg[u]] = v, Ind[u][deg[u]++] = i;
    }
}

void write_data(void)
{
    int i;
    for(i = 1; i <= K; i++)
        printf("%d\n", res[i]);
}

int main(void)
{
    freopen("radiatie.in", "rt", stdin);
    freopen("radiatie.out", "wt", stdout);

    read_data();
    solve();
    write_data();

    return 0;
}