WA,85pts,Kruskal+ST求调
查看原帖
WA,85pts,Kruskal+ST求调
1037830
Ooj_bai楼主2024/6/15 17:14

代码如下

#define int long long
#define setmin(x) (memset(x,-0x7f,sizeof x))
using namespace std;
int n,m,ans,cnt,ans_mst;
int prt[100005],line_used[1000005];
struct line{
	int u,v,c;
}a[3000005];
bool cmp(line a,line b){return a.c<b.c;}
int getprt(int o){if(o==prt[o])return o;return prt[o]=getprt(prt[o]);}
void add(int x,int y){ int a=getprt(x),b=getprt(y); if(a!=b)prt[a]=b;}

struct node{
	int next,to,c;
}e[1000005];int h[1000005],cnt_n;
void ADD(int x,int y,int z){e[++cnt_n].to=y;e[cnt_n].next=h[x];e[cnt_n].c=z;h[x]=cnt_n;}

int root;
void prebody(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)prt[i]=i;
	for(int i=1;i<=m;i++){
		scanf("%lld%lld%lld",&a[i].u,&a[i].v,&a[i].c);
		a[i].c*=-1;
	}
	sort(a+1,a+m+1,cmp);
	for(int i=1;i<=m;i++){
		if(getprt(a[i].u)!=getprt(a[i].v)){
			if(!root)root=a[i].u;
			line_used[i]=1;
			ADD(a[i].u,a[i].v,a[i].c);
			ADD(a[i].v,a[i].u,a[i].c);
			ans+=a[i].c;cnt++;
			add(a[i].v,a[i].u);
		}
		if(cnt==n-1)break;
	}
	ans_mst=ans;
} 
int st[105][10005],prt_tree[10005],max_deep;
int st_max[105][10005],deep[10005];
void build_tree(int k){
	//cout<<k<<' '<<prt_tree[k]<<'\n';
	max_deep=max(max_deep,deep[k]);
	for(int i=h[k];i;i=e[i].next){
		if(e[i].to==prt_tree[k])continue;
		int now=e[i].to;
		prt_tree[now]=k;	deep[now]=deep[k]+1;
		st[0][now]=prt_tree[e[i].to];	st_max[0][now]=e[i].c;
		build_tree(now);
	}
}
void buildst(){
	build_tree(root);
	for(int len=1;len<=log(max_deep)/log(2);len++){
		for(int i=1;i<=n;i++){
			st[len][i]=st[len-1][st[len-1][i]];
			st_max[len][i]=max(st_max[len-1][i],st_max[len][i]);
			st_max[len][i]=max(st_max[len-1][st[len-1][i]],st_max[len][i]);
		}
	}
}
int LCA(int x,int y){
	int max_line=-2e18;
	if(deep[x]<deep[y])swap(x,y);
	int jump_deep;
	while(deep[x]>deep[y]){
		jump_deep=log(deep[x]-deep[y])/log(2);
		max_line=max(max_line,st_max[jump_deep][x]);
		x=st[jump_deep][x];
	}
	if(x==y)return max_line;
	int jump_lca=log(max_deep)/log(2);
	while(prt_tree[x]!=prt_tree[y]){
		if(st[jump_lca][x]==st[jump_lca][y]){jump_lca--;continue;}
		max_line=max(max_line,st_max[jump_lca][x]);
		max_line=max(max_line,st_max[jump_lca][y]);
		x=st[jump_lca][x];y=st[jump_lca][y];
	}
	max_line=max(max_line,max(st_max[0][x],st_max[0][y]));
	return max_line;
} 
void body(){
	int t;cin>>t;
	while(t--){
		int xx,yy;cin>>xx>>yy;
		int qqq=LCA(xx,yy);
		qqq*=-1;
		if(qqq==2e18)cout<<-1<<'\n';
		else cout<<qqq<<'\n';
	}
}
#define int int
int main(){
	setmin(st_max);
	cin.tie(0);cout.tie(0);
	prebody();
	buildst();
	body();
	return 0;
}```
2024/6/15 17:14
加载中...