第十四届蓝桥杯大赛软件赛省赛C/C++大学B组 试题 I: 景区导游

第十四届蓝桥杯大赛软件赛省赛C/C++大学B组 试题 I: 景区导游_第1张图片

第十四届蓝桥杯大赛软件赛省赛C/C++大学B组 试题 I: 景区导游_第2张图片

样例输入
6 4
1 2 1
1 3 1
3 4 2
3 5 2
4 6 3
2 6 5 1
样例输出
10 7 13 14
LCA模板题,多求几次LCA而已
#include
using namespace std;

typedef long long LL;
typedef pair<int,int> PII;

const int N = 100010;

vector<PII> g[N];
int f[N][23],d[N];
LL dist[N];

int a[N];

void bfs()
{
	queue<int> q;
	q.push(1);
	d[1]=1;
	while(!q.empty())
	{
		int u=q.front();q.pop();
		for(auto &p:g[u])
		{
			int j=p.first,w=p.second;
			if(d[j]) continue;
			d[j]=d[u]+1;
			dist[j]=dist[u]+w;
			f[j][0]=u;
			for(int k=1;k<=20;k++)
				f[j][k]=f[f[j][k-1]][k-1];
			q.push(j);
		}
	}
}

int lca(int x,int y)
{
	if(d[x]>d[y]) swap(x,y);
	for(int i=20;i>=0;i--)
		if(d[f[y][i]]>=d[x])
			y=f[y][i];
	if(x==y) return x;
	for(int i=20;i>=0;i--)
		if(f[x][i]!=f[y][i])
			x=f[x][i],y=f[y][i];
	return f[x][0]; 
}


int main()
{
	int n,k;cin>>n>>k;
	for(int i=2;i<=n;i++)
	{
		int u,v,t;cin>>u>>v>>t;
		g[u].push_back({v,t});
		g[v].push_back({u,t});
	}
	
	bfs();
	
	for(int i=1;i<=k;i++) cin>>a[i];
	
	LL res=0;
	for(int i=2;i<=k;i++) 
	{
		LL ans=dist[a[i]]+dist[a[i-1]]-dist[lca(a[i],a[i-1])]*2;
		res+=ans;
	}
	
	for(int i=1;i<=k;i++)
	{
		if(i==1) 
		{
			LL ans=dist[a[1]]+dist[a[2]]-dist[lca(a[1],a[2])]*2;
			cout<<res-ans<<" ";
		}
		else if(i==k)
		{
			LL ans=dist[a[k-1]]+dist[a[k]]-dist[lca(a[k-1],a[k])]*2;
			cout<<res-ans<<" ";
		}
		else
		{
			LL ans=0;
			ans+=dist[a[i-1]]+dist[a[i]]-dist[lca(a[i-1],a[i])]*2;
			ans+=dist[a[i]]+dist[a[i+1]]-dist[lca(a[i],a[i+1])]*2;
			ans-=dist[a[i-1]]+dist[a[i+1]]-dist[lca(a[i-1],a[i+1])]*2;
			cout<<res-ans<<" ";
		}
	}
	
	return 0;
} 

你可能感兴趣的:(#,图论,#,蓝桥杯,c++,蓝桥杯,c语言)