求助30pts re
查看原帖
求助30pts re
342244
jamesharden666楼主2022/11/2 17:31
#include<bits/stdc++.h>
using namespace std;
int n,m,k,a[3000+10],f[3000+10][3000+10],pos[3000+10][10+10];
long long ans=0;
vector<int> son[3000+10];
queue<int> q;
void bfs(int x)
{
    q.push(x);
    f[x][x]=1;
    while(!q.empty())
    {
        int t=q.front();
        q.pop();
        for(auto l:son[t])
            if(f[x][l]<0)
                f[x][l]=f[x][t]+1,q.push(l);
    }
    return ;
}
void work(int x,int y,int z,int p)
{
    if(!x||!y||!z||!p)
        return ;
    if(x==y||x==z||x==p||y==z||y==p||z==p)
        return ;
    if(f[1][x]>k||f[x][y]>k||f[y][z]>k||f[z][p]>k||f[p][1]>k)
        return ;
    ans=max(ans,1ll*(a[x]+a[y]+a[z]+a[p]));
    return ;
}
int main()
{
    cin>>n>>m>>k;
    k+=2;
    memset(f,-1,sizeof(f));
    memset(pos,0,sizeof(pos));
    for(int i=2;i<=n;++i)
        cin>>a[i];
    for(int i=1;i<=m;++i)
    {
        int x,y;
        cin>>x>>y;
        son[x].push_back(y);
        son[y].push_back(x);
    }
    bfs(1);
    for(int i=2;i<=n;++i)
    {
        bfs(i);
        for(int j=2;j<=n;++j)
        {
            if(f[i][j]!=-1&&f[1][j]!=-1&&f[i][j]<=k&&f[1][j]<=k&&i!=j)
            {
                int x=j;
                if(a[x]>a[pos[i][0]])
                    swap(x,pos[i][0]);
                if(a[x]>a[pos[i][1]])
                    swap(x,pos[i][1]);
                if(a[x]>a[pos[i][2]])
                    swap(x,pos[i][2]);
            }
        }
    }
    for(int i=2;i<=n;++i)
        for(int j=2;j<=n;++j)
            if(i!=j&&f[i][j]!=-1&&f[i][j]<=k)
                for(int x=0;x<3;++x)
                    for(int y=0;y<3;++y)
                        work(pos[i][x],i,j,pos[j][y]);
    cout<<ans;
    return 0;
}
2022/11/2 17:31
加载中...