Cod sursa(job #2103336)

Utilizator alexandra_paticaAndreea Alexandra Patica alexandra_patica Data 10 ianuarie 2018 00:37:28
Problema Radiatie Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;

struct punct
{
    int x, y, c;
}u[15002];
struct aaa
{
    int x, y;
};
int n,m, k, x, y, c, X, Y, Max,p[15002], M,t[15002], ct, rx, ry, i;
vector<aaa>G[15002];
bool ap[15002];
int dfs(int x)
{
    if (x==Y) return 1;
    int ok=0;
    int o;
    ap[x]=1;
    for (int i=0; i<G[x].size(); i++){
        o=0;
        if (ap[G[x][i].x]==0) o=dfs(G[x][i].x);
        if (o) {if (G[x][i].y>Max) Max=G[x][i].y; ok=1;}
    }
    ap[x]=0;
    return ok;
}

bool cmp(punct x, punct y)
{
    return (x.c<y.c);
}
int root (int x)
{
    while (t[x]!=x) x=t[x];
    return x;
}
void unific (int x, int y)
{
    if (p[x]<p[y]) t[x]=y;
    if (p[x]>p[y]) t[y]=x;
    if (p[x]==p[y]){
        t[y]=x;
        p[x]++;
    }
}

void kruskal()
{
    sort(u+1, u+m+1, cmp);
    i=1;
    while (k<n-1){
        rx=root(u[i].x);
        ry=root(u[i].y);
        if (rx!=ry){
            ++k;
            ct+=u[i].c;
            G[u[i].x].push_back({u[i].y, u[i].c});
            G[u[i].y].push_back({u[i].x, u[i].c});
            unific(rx, ry);
        }
        i++;
    }
}

int main ()
{
    freopen("radiatie.in", "r", stdin);
    freopen("radiatie.out", "w", stdout);

    scanf("%d%d%d", &n, &m, &M);
    for (i=1; i<=m; i++){
        scanf("%d%d%d", &x, &y, &c);
        u[i].x=x; u[i].y=y; u[i].c=c;
        t[i]=i;
    }

    kruskal();

    for (i=1; i<=M; i++){
        scanf("%d%d", &X, &Y);
        Max=0;
//        memset(ap, 0, sizeof(ap));
        x=dfs(X);
        printf("%d\n", Max);
    }
    return 0;
}