这一题虽然重题了,但是洛谷上我是过了的。
发现单测不会挂,多测就挂了。可是我每一个数组都清空了。
代码求调:
//the code is from chenjh
#include<cstdio>
#include<cstring>
#include<vector>
#include<utility>
#include<algorithm>
#define MAXN 20002
#define mp std::make_pair
#define lson rt<<1
#define rson rt<<1|1
using std::min;
using std::swap;
typedef std::pair<int,int> PII;
int n,m,q;
struct EDGE{
int u,v,w;
EDGE(){}EDGE(int _u,int _v,int _w){u=_u,v=_v,w=_w;}
bool operator < (const EDGE b)const{return w>b.w;}
}ed[100001];
std::vector<PII> G[MAXN];
int f[MAXN];
inline int find(const int x){return x==f[x]?x:f[x]=find(f[x]);}
inline void merge(int x,int y){x=find(x),y=find(y);if(x!=y)f[x]=y;}
void kruskal(){
for(int i=1;i<=n;i++) f[i]=i;
std::sort(ed+1,ed+m+1);
for(int i=1,u,v,ru,rv;i<=m;i++){
u=ed[i].u,v=ed[i].v,ru=find(u),rv=find(v);
if(ru!=rv) merge(ru,rv),G[u].push_back(mp(v,ed[i].w)),G[v].push_back(mp(u,ed[i].w));
}
}
int t=0,a[MAXN],id[MAXN],fa[MAXN],dep[MAXN],sz[MAXN],son[MAXN],tp[MAXN],rev[MAXN];
bool b[MAXN];
void DFS1(int u,int FA,int w){
fa[u]=FA,dep[u]=dep[FA]+1,sz[u]=1,a[u]=w;
for(PII V:G[u]){
int v=V.first;
if(v==FA) continue;
DFS1(v,u,V.second);
sz[u]+=sz[v];
if(sz[v]>sz[son[u]]) son[u]=v;
}
}
void DFS2(int u){
if(son[u]){
int v=son[u];
id[v]=++t,tp[v]=tp[u],rev[t]=v;
DFS2(v);
}
for(PII V:G[u])if(!tp[V.first]){
int v=V.first;id[v]=++t,tp[v]=rev[t]=v;
DFS2(v);
}
}
int tr[MAXN<<2];
void build(int rt,int l,int r){
if(l==r){tr[rt]=a[rev[l]];return;}
int mid=(l+r)>>1;
build(lson,l,mid);
build(rson,mid+1,r);
tr[rt]=min(tr[lson],tr[rson]);
}
int query(int rt,int l,int r,int L,int R){
if(L<=l&&r<=R)return tr[rt];
int mid=(l+r)>>1,ret=1e9;
if(L<=mid) ret=min(ret,query(lson,l,mid,L,R));
if(mid<R) ret=min(ret,query(rson,mid+1,r,L,R));
return ret;
}
int mian(){
for(int i=1;i<=n;i++) G[i].clear();
for(int i=1,u,v,w;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
ed[i]=EDGE(u,v,w);
}
t=0;
memset(a,0,sizeof a);
memset(b,0,sizeof b);
memset(dep,0,sizeof dep);
memset(fa,0,sizeof fa);
memset(id,0,sizeof id);
memset(rev,0,sizeof rev);
memset(son,0,sizeof son);
memset(sz,0,sizeof sz);
memset(tp,0,sizeof tp);
memset(tr,0,sizeof tr);
kruskal();
for(int i=1;i<=n;i++)if(!sz[i])DFS1(i,0,0),b[i]=1;
for(int i=1;i<=n;i++)if(b[i])id[i]=++t,tp[i]=rev[t]=i,DFS2(i);
build(1,1,n);
for(int u,v;q--;){
scanf("%d%d",&u,&v);
if(find(u)!=find(v)){printf("-1");if(q>0)putchar('\n');continue;}
int fu=tp[u],fv=tp[v],ans=1e9;
for(;fu!=fv;fu=tp[u=fa[u]]){
if(dep[fu]<dep[fv])swap(fu,fv),swap(u,v);
ans=min(ans,query(1,1,n,id[fu],id[u]));
}
if(u!=v){
if(dep[u]<dep[v]) swap(u,v);
ans=min(ans,query(1,1,n,id[son[v]],id[u]));
}
printf("%d",ans);
if(q>0) putchar('\n');
}
return 0;
}
int main(){
bool f=0;
while(~scanf("%d%d%d",&n,&m,&q)) f?putchar('\n'):f=1,mian();
return 0;
}