码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #636 (Div. 3) E. Weights Distributing 贪心+图

时间:2020-04-23 09:17:22      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:printf   clear   ref   mamicode   pop   路径   return   ons   using   

http://codeforces.com/contest/1343/problem/E

给定一个无向图,n个顶点,m条边,以及长度为m的数组(边权),保证每对顶点之间至少有一条路径;

mike计划从顶点a到顶点b再到顶点c,同一个顶点可以访问多次,每条边有一个边权,问怎样分配边权才能使mike走过的路的边权和最小,重复走过的路重复算。

求最小边权和。

思路:

技术图片

代码如下:

技术图片技术图片
#include <bits/stdc++.h>
using namespace std;
const int MAXN=5e5+5;
const int mod=1e9+7;
typedef long long ll;
const int inf=0x3f3f3f3f;
const long long INF=0x3f3f3f3f3f3f3f3f;
vector<int>g[MAXN];
ll w[MAXN],sum[MAXN];
int d[5][MAXN];
void bfs(int u,int t)
{
    queue<int>q;
    q.push(u);
    d[t][u]=0;
    while(!q.empty())
    {
        int v=q.front();
        q.pop();
        for(auto to:g[v])
        {
            if(d[t][to]!=-1)continue;
            d[t][to]=d[t][v]+1;
            q.push(to);
        }
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,m,a,b,c;
        scanf("%d%d%d%d%d",&n,&m,&a,&b,&c);
        for(int i=1;i<=m;i++)scanf("%lld",&w[i]);

        for(int i=1;i<=n+10;i++)d[0][i]=-1,d[1][i]=-1,d[2][i]=-1,sum[i]=0,g[i].clear();//初始化

        for(int i=1;i<=m;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            g[v].push_back(u);
            g[u].push_back(v);
        }

        sort(w+1,w+1+m);
        for(int i=1;i<=m;i++)sum[i]=sum[i-1]+w[i];

        bfs(a,0);//a->x
        bfs(b,1);//x->b || b->x
        bfs(c,2);//x->c

        ll ans=INF;
        for(int i=1;i<=n;i++)
        {
            if(d[0][i]+d[1][i]+d[2][i]>m)continue;//超过m时,sum数组越界,前缀和出现问题
            ans=min(ans,sum[d[1][i]]+sum[d[0][i]+d[1][i]+d[2][i]]);
        }
        printf("%lld\n",ans);
    }

    return 0;
}
View Code

 

Codeforces Round #636 (Div. 3) E. Weights Distributing 贪心+图

标签:printf   clear   ref   mamicode   pop   路径   return   ons   using   

原文地址:https://www.cnblogs.com/MZRONG/p/12758106.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!