【好题】思维+最短路——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
*/

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/12755409.html