80pts求助,悬关
查看原帖
80pts求助,悬关
852295
Mr_Vatican楼主2023/8/9 23:10
#include <bits/stdc++.h>
using namespace std;
long long a[2505],ans;
int n,m,k,tot,head[2505];
int bk[2505],dis[2505][2505];
vector<long long>vec[2505];
struct Edge
{
    int next,to;
}e[20005];
void add_edge(int u,int v)
{
    e[++tot].next=head[u];
    e[tot].to=v;
    head[u]=tot;
}
bool cmp(int x,int y)
{
    return a[x]>a[y];
}
void bfs(int st)
{
    queue<int>q;
    memset(bk,0,sizeof bk);
    q.push(st);
    bk[st]=1;
    dis[st][st]=0;
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        if(dis[1][u]<=k&&dis[st][u]<=k&&u!=st&&u!=1)
        {
            vec[st].emplace_back(u);
            sort(vec[st].begin(),vec[st].end(),cmp);
            if(vec[st].size()>3)
                vec[st].pop_back();
        }
        for(int i=head[u];i;i=e[i].next)
        {
            int v=e[i].to;
            if(bk[v])
                continue;
            dis[st][v]=dis[v][st]=dis[st][u]+1;
            q.push(v);
            bk[v]=1;
        }
    }
}
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    k++;
    for(int i=2;i<=n;i++)
    {
        scanf("%lld",&a[i]);
    }
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        add_edge(x,y);
        add_edge(y,x);
    }
    for(int i=1;i<=n;i++)
    {
        bfs(i);
    }
    for(int i=2;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            if(dis[i][j]>k)
                continue;
            for(auto p:vec[i])
            {
                for(auto q:vec[j])
                {
                    if(p!=q&&j!=p&&i!=q)
                        ans=max(ans,a[i]+a[j]+a[p]+a[q]);
                }
            }
        }
    }
    printf("%lld",ans);
}
2023/8/9 23:10
加载中...