记录编号 252189 评测结果 AAAAAAAAAA
题目名称 图的询问 最终得分 100
用户昵称 Gravatarbhiaibogf 是否通过 通过
代码语言 C++ 运行时间 0.119 s
提交时间 2016-04-19 18:53:10 内存使用 2.39 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

const int MAXN=15000+5,MAXM=30000+5,BIT=14;
int read(){
    int r=0;char c;
    while(!isdigit(c=getchar()));
    while(r=r*10+c-'0',isdigit(c=getchar()));
    return r;
}int n,m,k;
int dep[MAXN],f[MAXN][BIT+1],_max[MAXN][BIT+1];
vector<int> g[MAXN];
struct Edge{
    int u,v,w;
    void Read() {u=read();v=read();w=read();}
    bool operator < (const Edge& b) const {return w<b.w;}
}e[MAXM];

int p[MAXN];
int P(int x) {return (!p[x]||p[x]==x)?x:p[x]=P(p[x]);}
void DFS(int u){
    for(int i=0;i<g[u].size();i++){
        Edge &ee=e[g[u][i]];
        int v=ee.u==u?ee.v:ee.u,w=ee.w;
        if(v==f[u][0]) continue;
        dep[v]=dep[u]+1;
        f[v][0]=u; _max[v][0]=w;
        DFS(v);
    }
}void Kruscal(){
    sort(e,e+m);
    for(int i=0;i<m;i++){
        int u=e[i].u,v=e[i].v;
        int fu=P(u),fv=P(v);
        if(fu!=fv) g[u].push_back(i),g[v].push_back(i);
        p[fu]=fv;
    }
}void Init(){
    n=read();m=read();k=read();
    for(int i=0;i<m;i++) e[i].Read();
    Kruscal();
    dep[1]=1;
    DFS(1);
    for(int j=1;j<=BIT;j++)
        for(int i=1;i<=n;i++)
            f[i][j]=f[ f[i][j-1] ][j-1],_max[i][j]=max(_max[i][j-1],_max[ f[i][j-1] ][j-1]);
}int LCA(int u,int v){
    if(dep[u]<dep[v]) swap(u,v);
    int ans=0;
    for(int i=BIT;~i;i--)
        dep[f[u][i]]>=dep[v]?(ans=max(ans,_max[u][i]),u=f[u][i]):0;//别忘=...
    if(u==v) return ans;
    for(int i=BIT;~i;i--)
        f[u][i]^f[v][i]?(ans=max(ans,max(_max[u][i],_max[v][i])),u=f[u][i],v=f[v][i]):0;
    ans=max(ans,max(_max[u][0],_max[v][0]));
    return ans;
}

int main(){
#ifdef bhiaibogf
    freopen("in.in","r",stdin);
    freopen("out.out","w",stdout);
#else
    freopen("heatwave.in","r",stdin);
    freopen("heatwave.out","w",stdout);
#endif
    Init();
    //for(int i=1;i<=n;i++){
        //cout<<i<<":\n";
        //for(int j=0;j<=BIT;j++)
            //cout<<_max[i][j]<<' ';
        //puts("");
    //}
    while(k--){
        int u=read(),v=read();
        printf("%d\n",LCA(u,v));
    }
    return 0;
}