求调,悬关,码风可读
查看原帖
求调,悬关,码风可读
528840
xiao_pai_sha_shou楼主2025/2/5 21:22
#include<bits/stdc++.h>

#define int long long

using namespace std;

int n,m,q,cn;
vector<pair<int,int> > ed[2][20005];

void add(int k,int u,int v,int w){
	ed[k][u].push_back({v,w});
	ed[k][v].push_back({u,w});
}

int fa[10005],dfn[10005],low[10005];
int num;
int s[10005],sc[10005];
int fw[10005];

void build(int x,int y,int ww){
	int sum = ww;
	for(int i = y;i != x;i = fa[i]){
		s[i] = sum;
		sum += fw[i];
		//cout << sum << " ";
	}
	s[x] = sc[x] = sum;
	add(1,x,++cn,0);
	//cout << cn << endl;
	for(int i = y;i != x;i = fa[i]){
		sc[i] = sum;
		add(1,i,cn,min(s[i],sum-s[i]));
	}
}

void tarjan(int x,int f){
	//cout << x << endl;
	dfn[x] = low[x] = ++num;
	for(int i = 0;i < ed[0][x].size();++ i){
		int y = ed[0][x][i].first;
		int w = ed[0][x][i].second;
		if(!dfn[y]){
			fw[y] = w;
			fa[y] = x;
			tarjan(y,x);
			low[x] = min(low[x],low[y]);
		}
		else if(y != f)
			low[x] = min(low[x],dfn[y]);
		if(low[y] > dfn[x]){
			add(1,x,y,w);
		}
	}
	for(int i = 0;i < ed[0][x].size();++ i){
		int y = ed[0][x][i].first;
		int w = ed[0][x][i].second;
		if(fa[y] != x&&dfn[y] > dfn[x]){
			build(x,y,w);
		}
	}
}

int up[20005][16];
int d[20005];
int dp[20005];

void dfs(int x,int f){
	up[x][0] = f;
	for(int i = 0;i < ed[1][x].size();++ i){
		int y = ed[1][x][i].first;
		int w = ed[1][x][i].second;
		//cout << x << " " << y << " "<< w<< " ";
		//cout << endl;
		//cout << sc[x] << " " << sc[y] << endl;
		if(y == f) continue;
		d[y] = d[x]+w;
		dp[y] = dp[x]+1;
		dfs(y,x);
	}
}

int A,B;

int lca(int x,int y){
	if(dp[x] > dp[y]) swap(x,y);
	for(int i = 15;i >= 0;-- i){
		if(dp[up[y][i]] >= dp[x])
			y = up[y][i];
	}
	if(x == y) return x;
	for(int i = 15;i >= 0;-- i){
		if(up[y][i] != up[x][i])
			x = up[x][i],y = up[y][i];
	}
	A = x,B = y;
	return up[y][0];
}

signed main(){
	
	freopen("P5236_1.in","r",stdin);
	
	cin >> n >> m >> q;cn = n;
	for(int i = 1;i <= m;++ i){
		int u,v,w;
		cin >> u >> v >> w;
		add(0,u,v,w);
	}
	//cout << endl;   
	tarjan(1,0);
	
	dp[1] = 1;
	dfs(1,0);
	
	for(int i = 1;i < 16;++ i){
		for(int x = 1;x <= cn;++ x){
			up[x][i] = up[up[x][i-1]][i-1];
		}
	}
	
	while(q--){
		int u,v;
		cin >> u >> v;
		int p = lca(u,v);
		if(p <= n){
			//cout << d[u] << " " << d[v] << endl;
			cout << d[u]+d[v]-2*d[p] << endl;
		}
		else{
			int len = abs(d[A]-d[B]);
			len = min(len,sc[A]-len);
			cout << len+d[u]-d[A]+d[v]-d[B] << endl;
		}
	}
	
	return 0;
	
}

样例全过但是交上去没有一个对的,求求大佬们帮帮我!

2025/2/5 21:22
加载中...