【好题】思维+最短路——cf1343E
/* ÉèxÊÇa->b,b->cµÄ½»µã¿ÉÒÔ½«Â·¾¶a->b->cת»¯Îªa->x->b->x->c ¿É¼ûx-bÕâ¶Î·¾¶Éϵı߱»ËãÁËÁ½´Î£¬Ö»ÒªÃ¶¾Ùµãx£¬Çó×îС´ð°¸¼´¿É */ #include<bits/stdc++.h> using namespace std; #define N 400005 int p[N],n,m,a,b,c; long long sum[N]; vector<int>G[N]; int cmp(int a,int b){return a>b;} int vis[N],da[N],db[N],dc[N]; void dfs(int s,int d[]){ d[s]=0; queue<int>q; for(int i=1;i<=n;i++)vis[i]=0; q.push(s);vis[s]=1; while(q.size()){ int u=q.front();q.pop(); for(auto v:G[u]) if(!vis[v]){ d[v]=d[u]+1; vis[v]=1; q.push(v); } } } int main(){ int t;cin>>t; while(t--){ cin>>n>>m>>a>>b>>c; for(int i=1;i<=m;i++)scanf("%d",&p[i]); for(int i=1;i<=m;i++){ int u,v;scanf("%d%d",&u,&v); G[u].push_back(v); G[v].push_back(u); } sort(p+1,p+1+m); for(int i=1;i<=m;i++)sum[i]=sum[i-1]+p[i]; for(int i=m+1;i<=2*m;i++)sum[i]=0x3f3f3f3f; dfs(a,da);dfs(b,db);dfs(c,dc); long long ans=0x3f3f3f3f3f3f3f3f; for(int i=1;i<=n;i++){ long long now=0; now+=sum[db[i]]; if(da[i]+db[i]+dc[i]>m)continue; now+=sum[da[i]+db[i]+dc[i]]; ans=min(ans,now); } cout<<ans<<'\n'; for(int i=1;i<=n;i++)G[i].clear(); } } /** 4 5 3 2 4 1 2 3 3 4 1 3 4 1 2 3 2 1 3 */