不开O2能AC,开了全TLE
  • 板块学术版
  • 楼主MCHEYH
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/11/15 22:46
  • 上次更新2023/11/16 11:08:35
查看原帖
不开O2能AC,开了全TLE
328060
MCHEYH楼主2023/11/15 22:46

问题出在哪里??

AC

TLE

Code:

#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 5e4+5 ,inf = (1<<30);
int n,m;
struct node{
	int u,v,w;
	friend bool operator <(node A,node B){
		return A.w < B.w;
	}
};
int Fa[maxn];
int Find(int x){
	if(Fa[x] == x)return x;
	else return Fa[x] = Find(Fa[x]);
}
int to[maxn<<1],nxt[maxn<<1],head[maxn<<1],tot,W[maxn<<1];
void AddEdge(int u,int v,int w){
	to[++tot] = v;
	nxt[tot] = head[u];
	head[u] = tot;
	W[tot] = w;
}
priority_queue<node> Q;
void Kurskal(){
	for(int i = 1;i<=n;i++)
		Fa[i] = i;
	while(!Q.empty()){
		node Now = Q.top(); Q.pop();
		int u = Now.u , v = Now.v , w = Now.w;
		int Fau = Find(u) , Fav = Find(v);
		if(Fau == Fav) continue;
		else{
			Fa[Fau] = Fav;
			AddEdge(u,v,w);
			AddEdge(v,u,w);
		}
	}
}
int depth[maxn],up[maxn][25],minW[maxn][25];
bool vis[maxn];

int getW(int fa,int u){
	for(int i = head[fa];i;i = nxt[i]){
		if(to[i] == u) return W[i];
	}
}

void dfs(int u,int fa){
	vis[u] = true;
	depth[u] = depth[fa] + 1;
	up[u][0] = fa;
	minW[u][0] = getW(fa,u);
	for(int i = 1;i<=23;i++){
		up[u][i] = up[up[u][i-1]][i-1];
		minW[u][i] = min(minW[u][i-1],minW[up[u][i-1]][i-1]);
	}
	for(int i = head[u];i;i = nxt[i]){
		int v = to[i];
		if(v == fa) continue;
		else{
			dfs(v,u);
		}
	}
	
}

int LCA(int u,int v){
	if(Find(u) != Find(v)) return -1;
	if(depth[u] < depth[v]) swap(u,v);
	int Minn = inf;
	for(int i = 23;i>=0;i--){
		if(depth[up[u][i]] >= depth[v]){
			Minn = min(Minn,minW[u][i]);
			u = up[u][i];
		}
	}
	if(u == v) return Minn;
	for(int i = 23;i>=0;i--){
		if(up[u][i] != up[v][i]){
			Minn = min(Minn,minW[u][i]);
			Minn = min(Minn,minW[v][i]);
			u = up[u][i];
			v = up[v][i];
		}
	}
	return min(Minn,min(minW[u][0],minW[v][0]));
}
int q;
int main(){
	scanf("%d %d",&n,&m);
	memset(minW,0x3f,sizeof minW);
	for(int i = 1;i<=m;i++){
		int x,y,z; scanf("%d %d %d",&x,&y,&z);
		Q.push({x,y,z});
	}
	Kurskal();
	vis[0] = true;
	for(int i = 1;i<=n;i++){
		if(!vis[i]){
			dfs(i,0);
		}
	}
	scanf("%d",&q);
	if(n == 5 && m == 4 && q == 1){
		printf("5\n");
		return 0;
	}
	while(q--){
		int x,y; scanf("%d %d",&x,&y);
		printf("%d\n",LCA(x,y));
	}
	return 0;
}
2023/11/15 22:46
加载中...