求条!!玄关
查看原帖
求条!!玄关
745358
ChenZQ楼主2025/8/5 14:55
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 400010;
int h[N],e[N],w[N],ne[N],idx;
void add(int a,int b,int c){e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;}
int n,m,q;
int dfn[N],low[N],tot=0,stk[N],tp=0,vis[N];
vector<int> v[N];
vector<int> wa[N];
vector<int> b;
int f[N],flag[N];
int nxt[N],nw[N];
int count_sum(int u)
{
	if(flag[u]) return 0;
	flag[u]=1;
	for(int i=h[u];i!=-1;i=ne[i])
	{
		if(f[e[i]])
		{
			nxt[u]=e[i];
			nw[u]=w[i];
			int q=count_sum(e[i])+w[i];
			return q;
		}
	}
}
int cnt=n;
void dfs(int u)
{
	low[u]=dfn[u]=++tot;
	stk[++tp]=u;vis[u]=1;
	for(int i=h[u];i!=-1;i=ne[i])
	{
		if(!dfn[e[i]])
		{
			dfs(e[i]);
			low[u]=min(low[u],low[e[i]]);
			if(low[e[i]]==dfn[u])
			{
				f[u]=1;
				b.push_back(u);
				for (int x = 0; x != e[i]; --tp) 
				{
          			x=stk[tp];
          			f[x]=1;b.push_back(x); 
       			}//cout<<endl;
				int sum=count_sum(u);
				int id=nxt[u];
				int h=nw[u];
				cnt++;
				int t=b.size();
				for(int i=0;i<t;i++) f[b[i]]=0,flag[b[i]]=0;
				while(id!=u)
				{
				//	cout<<id<<" aa"<<cnt<<endl;
					v[id].push_back(cnt);
					wa[id].push_back(min(h,q-h));
					v[cnt].push_back(id);
					wa[cnt].push_back(min(h,q-h));
					h+=nw[id];
					id=nxt[id];
				}
			//	cout<<u<<" "<<cnt<<endl;
				v[cnt].push_back(u);wa[cnt].push_back(0);
				v[u].push_back(cnt);wa[u].push_back(0);
				b.clear();
			} 
		}
		else low[u]=min(low[u],dfn[e[i]]);
	}
}
int ww[N][25],dp[N][25],dep[N],gk[N];
void init(int u,int f,int w)
{//cout<<u<<endl;
	gk[u]=1;
	dep[u]=dep[f]+1;
	dp[u][0]=f;ww[u][0]=w;
	int t=v[u].size();
	for(int i=1;i<=24;i++)
	{
		dp[u][i]=dp[dp[u][i-1]][i-1];
		ww[u][i]=ww[u][i-1]+ww[dp[u][i-1]][i-1];
	}
	for(int i=0;i<t;i++)
	{
		if(v[u][i]!=f)init(v[u][i],u,wa[u][i]);//cout<<"adf";
	}
}
int lca(int a,int b)
{
	if(dep[a]<dep[b])swap(a,b);
	int k=dep[a]-dep[b];
	int sum=0;
	for(int i=0;i<=22;i++)
	{
		if(k&(1<<i)) sum+=ww[a][i],a=dp[a][i];
	}
	if(a==b) return sum;
	for(int i=22;i>=0;i--)
	{
		if(dp[a][i]!=dp[b][i])
		{
			sum+=ww[a][i];sum+=ww[b][i];
			a=dp[a][i],b=dp[b][i];
		}
	}
	return sum+ww[a][0]+ww[b][0];
}
signed main()
{
	scanf("%lld%lld%lld",&n,&m,&q);
	cnt=n;
	memset(h,-1,sizeof h);
	for(int i=1;i<=m;i++)
	{
		int a,b,c;
		scanf("%lld%lld%lld",&a,&b,&c);
		add(a,b,c);
		add(b,a,c);
	}
	for(int i=1;i<=n;i++)
	{
		if(!dfn[i]) dfs(i),tp--;
	}
	for(int i=1;i<=cnt;i++)
	{
		if(!gk[i]) init(i,i,0);
	}//cout<<"asdgf"; 
	while(q--)
	{
		int a,b;
		scanf("%lld%lld",&a,&b);
		cout<<lca(a,b)<<endl;
	}
}
2025/8/5 14:55
加载中...