求调,玄关,马蜂很好
查看原帖
求调,玄关,马蜂很好
611878
sunqihuan楼主2024/11/19 21:45

样例过了,但WA 0pts

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e4+5;
int n,m,T,sq_num,ro_num;
int dfn[N],low[N],fa[N],b[N],sum[N],dis[N],stot[N];
struct node{
	int v,w;
};
vector<node> g[N],gg[N];
int deep[N],lp[N][30];
void sq_ro(int u,int v,int w){
	sq_num++;
	int s=w,p=v;
	while(p!=fa[u]){
		sum[p]=s;
		s+=b[p];
		p=fa[p];
	}
	sum[sq_num]=sum[u];
	sum[u]=0;
	p=v;
	while(p!=fa[u]){
		int t=min(sum[p],sum[sq_num]-sum[p]);
		gg[sq_num].push_back({p,t});
		gg[p].push_back({sq_num,t});
		p=fa[p];
		stot[p]=s;
	}
}
void Tarjan(int u,int f){
	dfn[u]=low[u]=++ro_num;
	for(int i=0;i<g[u].size();i++){
		int v=g[u][i].v,w=g[u][i].w;
		if(v==f)continue;
		if(dfn[v]==0){
			fa[v]=u;
			b[v]=w;
			Tarjan(v,u);
			low[u]=min(low[u],low[v]);
		}else low[u]=min(low[u],dfn[v]);
		if(low[v]<=dfn[u])continue;
		gg[u].push_back({v,w});
		gg[v].push_back({u,w});
	}
	for(int i=0;i<g[u].size();i++){
		int v=g[u][i].v,w=g[u][i].w;
		if(fa[v]==u)continue;
		if(dfn[v]<=dfn[u])continue;
		sq_ro(u,v,w);
	}
}
void dfs(int u,int fat) {
	deep[u]=deep[fat]+1;
	lp[u][0]=fat;
	for(int i=1; (1<<i)<=deep[u]; i++) {
		lp[u][i]=lp[lp[u][i-1]][i-1];
	}
	for(int i=0;i<gg[u].size();i++) {
		int v=gg[u][i].v,w=gg[u][i].w;
		if(v!=fat) {
			dis[v]=dis[u]+w;
			dfs(v,u);
		}
	}
}
int A,B;
int lca(int a,int b) {
	if(deep[a]<deep[b]) {
		swap(a,b);
	}
	int lg=0;
	for(;(1<<lg)<=deep[a];){
		lg++;
	} 
	lg--;
	for(int i=lg;i>=0;i--){
		if(deep[a]-(1<<i)>=deep[b]){
			a=lp[a][i];
		}
	}
	if(a==b)return a;
	for(int i=lg;i>=0;i--){
		if(lp[a][i] !=lp[b][i]){
			a=lp[a][i];
			b=lp[b][i];
		}
	}
	A=a;
	B=b;
	return lp[a][0];
}
signed main(){
//	freopen("P5236_1.in","r",stdin);
//	freopen("P5236_1.ans","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>T;
	sq_num=n;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		g[u].push_back({v,w});
		g[v].push_back({u,v});
	}
	Tarjan(1,-1);
	dfs(1,-1);
	while(T--){
		A=B=0;
		int u,v,ans=0;
		cin>>u>>v;
		int LCA=lca(u,v);
		if(LCA<=n)ans=dis[u]+dis[v]-(dis[LCA]*2),cout<<ans<<endl;
		else{
			ans=dis[u]+dis[v]-dis[A]-dis[B];
			if(sum[A]<sum[B])swap(A,B);
			ans+=min(sum[A]-sum[B],sum[LCA]+sum[B]-sum[A]);
//			ans=dis[u]-dis[A]+dis[v]-dis[B];
//          ans+=min(abs(sum[A]-sum[B]),stot[A]-abs(sum[A]-sum[B]));
            cout<<ans<<endl;
		}
	}
	return 0;
}


2024/11/19 21:45
加载中...