Wrong Answer 求助
查看原帖
Wrong Answer 求助
577880
cjh20090318楼主2023/7/17 19:29

这一题虽然重题了,但是洛谷上我是过了的。

发现单测不会挂,多测就挂了。可是我每一个数组都清空了。

代码求调:

//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;
}
2023/7/17 19:29
加载中...