比赛 寒假集训5 评测结果 AAAWWWWWWT
题目名称 白色相簿的季节 最终得分 30
用户昵称 Ruyi 运行时间 2.621 s
代码语言 C++ 内存使用 6.53 MiB
提交时间 2026-03-01 10:59:54
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
#define N 200001
using namespace std;
ll n,q,k,p,s,t,u,v,w,head[N],nxt[N],to[N],val[N],cnt,dis[N],vis[N];
void add(ll u,ll v,ll w){
	to[++cnt]=v;
	val[cnt]=w;
	nxt[cnt]=head[u];
	head[u]=cnt;
	return ;
}
void dijkstra(ll s){
	for(int i=1;i<=n;i++){
		dis[i]=2e9;
		vis[i]=0;
	}
	dis[s]=0;
	priority_queue<pair<ll,ll>> qq;
	qq.push(make_pair(0,s));
	while(!qq.empty()){
		ll u=qq.top().second;
		qq.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(int i=head[u];i;i=nxt[i]){
			ll v=to[i],w=val[i];
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				qq.push(make_pair(-dis[v],v));
			}
		}
	}
	return ;
}
int main(){
	freopen("wa.in","r",stdin);
	freopen("wa.out","w",stdout);
	cin>>n>>q>>k;
	for(int i=1;i<n;i++){
		cin>>u>>v>>w;
		add(u,v,w);
		add(v,u,w);
	}
	for(int i=1;i<=k;i++) cin>>p;
	while(q--){
		cin>>s>>t;
        if(k==n){
            dijkstra(s);
            cout<<dis[t]<<endl;
        }else if(k==1){
            dijkstra(p);
            cout<<dis[s]+dis[t]<<endl;
        }else cout<<-1<<endl;
	}
	return 0;
}