求求大佬帮蒟蒻调一调吧
查看原帖
求求大佬帮蒟蒻调一调吧
654751
仙肉粽子楼主2023/10/18 00:28

WA on #5

/*
*/
#include<bits/stdc++.h>
#define rep(i,s1,s2,s3) for(i = s1;i <= s2;i += s3)
#define r(i,s1,s2,s3) for(i = s1;i >= s2;i -= s3)
#define sort stable_sort
#define ull unsigned ll
#define INF 0x7f7f7f7f
#define ll long long
using namespace std;
ll n,m,k,qe,d[100010],fa[100010],lg[100010],dis[100010],f[100010][20],w[100010][20];
bool vis[100010];
struct node{
	ll u,v,w;
}e[300010];
struct edge{
	ll id,head[100010];
	struct node{
		ll u,v,w,next;
	}e[1200010];
	void add(ll u,ll v,ll w){
		e[++id] = node{u,v,w,head[u]};
		head[u] = id;
	}
}e1,e2;
struct ben{
	ll id,number;
	bool operator < (const ben &x) const{return x.number < number;}
};
priority_queue <ben> q;
void Dijkstra(){
	memset(dis,0x3f,sizeof(dis));
	ll i;
	ben tmp,temp;
	rep(i,1,k,1) e1.add(i,0,0),e1.add(0,i,0);
	dis[0] = 0;
	q.push(ben{0,0}); 
	while(!q.empty()){
		tmp = q.top();
		q.pop();
		if(vis[tmp.id]) continue; 
		vis[tmp.id] = 1;
		for(i = e1.head[tmp.id];i;i = e1.e[i].next){
			if(dis[e1.e[i].v] > dis[tmp.id] + e1.e[i].w){
				dis[e1.e[i].v] = dis[tmp.id] + e1.e[i].w;
				if(!vis[e1.e[i].v]){
					temp.id = e1.e[i].v,temp.number = dis[e1.e[i].v];
					q.push(temp);
				}
			}
		}
	}
}
ll find(ll id){
	if(id == fa[id]) return id;
	return fa[id] = find(fa[id]);
}
bool cmp(node s1,node s2){
	return s1.w < s2.w;
}
void kruskal(){
	sort(e + 1,e + m + 1,cmp);
	ll i,cnt = 0;
	rep(i,1,n,1) fa[i] = i;
	rep(i,1,m,1){
		if(find(e[i].u) == find(e[i].v)) continue;
		fa[find(e[i].u)] = find(e[i].v);
		e2.add(e[i].u,e[i].v,e[i].w);
		e2.add(e[i].v,e[i].u,e[i].w);
		cnt++;
		if(cnt == n - 1) return ;
	}
}
void dfs(ll u,ll fa){
	f[u][0] = fa;
	for(ll i = e2.head[u];i;i = e2.e[i].next) if(e2.e[i].v != fa){
		d[e2.e[i].v] = d[u] + 1;
		w[e2.e[i].v][0] = e2.e[i].w;
		dfs(e2.e[i].v,u);
	}
}
ll lca(ll u,ll v){
	ll res = 0;
	if(d[u] < d[v]) swap(u,v);
	while(d[u] > d[v]){
		res = max(res,w[u][lg[d[u] - d[v]]]);
		u = f[u][lg[d[u] - d[v]]];
	}
	if(u == v) return res;
	ll i;
	r(i,lg[d[u]],0,1) if(f[u][i] != f[v][i]){
		res = max(res,max(w[u][i],w[v][i]));
		u = f[u][i],v = f[v][i];
	}
	return max(res,max(w[u][0],w[v][0]));
} 
int main(){
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	cin>>n>>m>>k>>qe;
	ll i,j,u,v,w_;
	lg[0] = -1;
	rep(i,1,n,1) lg[i] = lg[n >> 1] + 1;
	rep(i,1,m,1){
		cin>>u>>v>>w_;
		e1.add(u,v,w_);
		e1.add(v,u,w_);
		e[i] = node{u,v,w_};
	}
	Dijkstra();
	rep(i,1,m,1)
		e[i].w += dis[e[i].u] + dis[e[i].v];
	kruskal();
	dfs(1,0);
	rep(j,1,lg[n],1) rep(i,1,n,1){
		f[i][j] = f[f[i][j - 1]][j - 1];
		w[i][j] = max(w[i][j - 1],w[f[i][j - 1]][j - 1]);
	}
//	rep(i,1,20,1){
//		rep(j,1,n,1) cout<<f[j][i]<<' ';
//		cout<<'\n';
//	}
//	rep(i,1,20,1){
//		rep(j,1,n,1) cout<<w[j][i]<<' ';
//		cout<<'\n';
//	}
	rep(i,1,qe,1){
		cin>>u>>v;
		cout<<lca(u,v)<<'\n';
	}
	return 0;
}
2023/10/18 00:28
加载中...