难道是我数组开了十几个的原因?树剖+线段树竟MLE了70%
查看原帖
难道是我数组开了十几个的原因?树剖+线段树竟MLE了70%
306734
phil071128楼主2021/10/8 22:23
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int n,m;
/*
1. 跑最大生成树建立新图
2. 树剖维护树上两点之间 min 
*/ 
struct a1{  //原图 
	int u,v,w;
}a[N]; 

struct node{
	int v,w;   	//kruskal跑完后的图 
};
vector<node>s[N]; 
//并查集
int f[N];
void init(){
	for(int i=1;i<=n;i++){
		f[i]=i;
	}
} 
int find(int x){
	if(f[x]==x) return x;
	return f[x]=find(f[x]);
} 
//最大生成树
bool cmp(a1 a,a1 b){
	return a.w>b.w;
} 
void kruskal(){
	sort(a+1,a+m+1,cmp);
	int sum=0;
	for(int i=1;i<=m;i++){
		int u=find(a[i].u);
		int v=find(a[i].v);
		if(u!=v){
			//cout<<a[i].w<<" ";
			s[a[i].u].push_back(node{a[i].v,a[i].w}); 
			s[a[i].v].push_back(node{a[i].u,a[i].w}); 
			f[u]=v;
			//sum++;
		//	if(sum==n-1) return ;
			
		}
	}
}
int w[N],wt[N],dep[N],son[N],id[N],fa[N],siz[N],cnt,top[N];

//线段树部分 
int tree[N*4];
void push_up(int p){
	tree[p]=min(tree[p*2],tree[p*2+1]);
}
void build(int p,int l,int r){
	if(l==r) {
		tree[p]=wt[l];
		return ;
	}
	int mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	push_up(p);
	return ;
}
int query_min(int p,int l,int r,int nl,int nr){
	int ans=0x7ffffff;
	int mid=(l+r)/2;
	if(nl<=l&&r<=nr){
		return tree[p];
	}
	if(nl<=mid) ans=min(ans,query_min(p*2,l,mid,nl,nr));
	if(mid<nr) ans=min(ans,query_min(p*2+1,mid+1,r,nl,nr));
	return ans;
}
//树链剖分部分 
void dfs1(int x,int f){
	dep[x]=dep[f]+1;
	fa[x]=f;
	siz[x]=1;
	int maxson=0;
	for(int i=0;i<s[x].size();i++){
		int y=s[x][i].v;
		if(y==f) continue;
		w[y]=s[x][i].w;
		dfs1(y,x);
		siz[x]+=siz[y];
		if(siz[y]>maxson){
			maxson=siz[y];
			son[x]=y;
		}
	}
}
void dfs2(int x,int topf){
	cnt++;
	top[x]=topf;
	id[x]=cnt;
	wt[cnt]=w[x];
	if(!son[x]) return ;
	dfs2(son[x],topf);
	for(int i=0;i<s[x].size();i++){
		int y=s[x][i].v;
		if(y==fa[x]||y==son[x]) continue;
		dfs2(y,y);
	}
}
int cao1(int x,int y){
	//min(x...y)
	if(find(x)!=find(y)){
		return -1;
	}
	int ans=0x7ffffff;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans=min(ans,query_min(1,1,n,id[top[x]],id[x]));
		x=fa[top[x]];
	}
	if(x==y){
		return ans;
	}
	if(dep[x]>dep[y]){
		swap(x,y);
	}
	ans=min(ans,query_min(1,1,n,id[x]+1,id[y]));
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>a[i].u>>a[i].v>>a[i].w;
	}
	init();//并查集初始化 
	kruskal();	
//	for(int i=1;i<=n;i++){
//		for(int j=0;j<s[i].size();j++){
//			cout<<i<<" "<<s[i][j].v<<" "<<s[i][j].w<<endl;
//		}
//	}
	dfs1(1,1);
	dfs2(1,1);
	build(1,1,n);
	int q;
	cin>>q;
	int u,v;
	for(int i=1;i<=q;i++){
		cin>>u>>v;
		cout<<cao1(u,v)<<endl;
	}
	
	return 0;
}

2021/10/8 22:23
加载中...