https://nanti.jisuanke.com/t/41349
消防队是整体;
#include<bits/stdc++.h>
#define endl '\n'
#define mem(a) memset(a,0,sizeof(a)
using namespace std;
typedef long long ll;
const ll MAXN=3e3+5;
const ll inf=2e18;
struct qnode{
ll v;
ll c;
qnode(ll _v=0,ll _c=0):v(_v),c(_c){}
bool operator < (const qnode &r)const {
return c>r.c;
}
};
struct Edgee{
ll v,cost;
Edgee(ll _v=0,ll _cost=0):v(_v),cost(_cost){}
};
vector<Edgee>E[MAXN];
bool vis[MAXN];
ll dist[MAXN];
ll s,k,c;
int tmp[10005];
ll kk[1005];
void Dijkstra(int n,int start,bool f)
{
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++)
dist[i]=inf;
priority_queue<qnode>que;
while(!que.empty())
que.pop();
if(f)
{
dist[start]=0;
que.push(qnode(start,0));
}
else
{
for(int i=1;i<=k;i++)
{
dist[tmp[i]]=0;
que.push(qnode(tmp[i],0));
}
}
qnode tmp;
while(!que.empty())
{
tmp=que.top();
que.pop();
ll u=tmp.v;
if(vis[u])
continue;
vis[u]=true;
for(int i=0;i<E[u].size();i++)
{
ll v=E[tmp.v][i].v;
ll cost=E[u][i].cost;
if(!vis[v]&&dist[v]>dist[u]+cost)
{
dist[v]=dist[u]+cost;
que.push(qnode(v,dist[v]));
}
}
}
}
void add(ll u,ll v,ll w)
{
E[u].push_back(Edgee(v,w));
}
int main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
kk[i]=inf;
for(int i=1;i<=n;i++)E[i].clear();
cin>>s>>k>>c;
for(int i=1;i<=k;i++){
cin>>tmp[i];
}
for(int i=1;i<=m;i++){
ll u,v,w;
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
Dijkstra(n,s,1);
ll ans=0;
for(int i=1;i<=n;i++){
ans=max(ans,dist[i]);
}
ll ans_tmp=0;
// for(int i=1;i<=k;i++){
// Dijkstra(n,tmp[i]);
// for(int j=1;j<=n;j++){
// kk[j]=min(kk[j],dist[j]);
// }
// }
Dijkstra(n,s,0);
for(int i=1;i<=n;i++){
ans_tmp=max(ans_tmp,dist[i]);
}
if(ans_tmp*c<ans)
cout<<ans_tmp<<endl;
else cout<<ans<<endl;
}
}
#include<bits/stdc++.h>
#define endl '\n'
#define mem(a) memset(a,0,sizeof(a)
using namespace std;
typedef long long ll;
const ll MAXN=3e3+5;
const ll inf=2e18;
struct qnode{
ll v;
ll c;
qnode(ll _v=0,ll _c=0):v(_v),c(_c){}
bool operator < (const qnode &r)const {
return c>r.c;
}
};
struct Edgee{
ll v,cost;
Edgee(ll _v=0,ll _cost=0):v(_v),cost(_cost){}
};
vector<Edgee>E[MAXN];
bool vis[MAXN];
ll dist[MAXN];
void Dijkstra(int n,int start)
{
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++)
dist[i]=inf;
priority_queue<qnode>que;
while(!que.empty())
que.pop();
dist[start]=0;
que.push(qnode(start,0));
qnode tmp;
while(!que.empty())
{
tmp=que.top();
que.pop();
ll u=tmp.v;
if(vis[u])
continue;
vis[u]=true;
for(int i=0;i<E[u].size();i++)
{
ll v=E[tmp.v][i].v;
ll cost=E[u][i].cost;
if(!vis[v]&&dist[v]>dist[u]+cost)
{
dist[v]=dist[u]+cost;
que.push(qnode(v,dist[v]));
}
}
}
}
void add(ll u,ll v,ll w)
{
E[u].push_back(Edgee(v,w));
}
int tmp[10005];
ll kk[1005];
int main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
kk[i]=inf;
for(int i=1;i<=n;i++)E[i].clear();
ll s,k,c;
cin>>s>>k>>c;
for(int i=1;i<=k;i++){
cin>>tmp[i];
}
for(int i=1;i<=m;i++){
ll u,v,w;
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
Dijkstra(n,s);
ll ans=0;
for(int i=1;i<=n;i++){
ans=max(ans,dist[i]);
}
ll ans_tmp=0;
for(int i=1;i<=k;i++){
Dijkstra(n,tmp[i]);
for(int j=1;j<=n;j++){
kk[j]=min(kk[j],dist[j]);
}
}
for(int i=1;i<=n;i++){
ans_tmp=max(ans_tmp,kk[i]);
}
if(ans_tmp*c<ans)
cout<<ans_tmp<<endl;
else cout<<ans<<endl;
}
}