解析:
建立一个虚拟源点连接牛牛所占领得星球,然后虚拟源点作为最短路得起点。即可
int w[500005],e[500005],ne[500005],h[500005],idx;
void add(int a,int b,int c)
{
e[idx]=b;w[idx]=c;ne[idx]=h[a];h[a]=idx++;
}
int n,p,q,x,y,z;
int dist[500005];
bool st[500005];
void dij(int n)
{
priority_queue<pair<int,int> ,vector<pair<int,int> >,greater<pair<int,int> > > q;
q.push({0,n});
memset(dist,0x3f,sizeof dist);
dist[n]=0;
while(q.size())
{
auto u=q.top();q.pop();
int x=u.second;
if(st[x]) continue;
st[x]=1;
for(int i=h[x];~i;i=ne[i]){
int v=e[i];
if(dist[v]>dist[x]+w[i]){
dist[v]=dist[x]+w[i];
q.push({dist[v],v});
}
}
}
}
int Length(vector<int>& niuniu, vector<int>& niumei, vector<vector<int> >& path, int nn) {
// write code here
memset(h,-1,sizeof h);
for(auto x : niuniu){
//cout<<x<<endl;
add(nn+1,x,0);add(x,nn+1,0);
}
for(auto x:path){
//cout<<x[0]<<" "<<x[1]<<" "<<x[2]<<endl;
add(x[0],x[1],x[2]);
add(x[1],x[0],x[2]);
}
int ans=0x3f3f3f3f;
dij(nn+1);
for(auto x:niumei){
ans=min(ans,dist[x]);
}
if(ans==0x3f3f3f3f) ans=-1;
return ans;
}