求助 WA 95pts
查看原帖
求助 WA 95pts
356003
Moeebius楼主2022/11/1 14:38

RT,考场代码,95pts 有一个点死活过不去(

#include<bits/stdc++.h>
using namespace std;

#define il inline
#define pb push_back
#define pii pair<int,int>
#define mkp make_pair
#define ll long long
#define For(i,j,k) for(int i=(j); i<=(k); i++)
#define ForDown(i,j,k) for(int i=(j); i>=(k); i--)
#define Sq(x) (1ll*(x)*(x))
#define Sz(x) ((signed)x.size())

template<typename T> void read(T &x)
{
    char c=getchar(); int m=1; x=0;
    while(!isdigit(c)) m=c=='-'?-1:m,c=getchar();
    while(isdigit(c)) x=x*10+c-'0',c=getchar();
    x*=m;
}
template<typename T, typename ...Args> void read(T &x, Args &...y)
{
    read(x); read(y...);
}

const int MAXN=2505;
int n,m,k;
ll val[MAXN],used[MAXN],f[MAXN][3],g[MAXN][3];
vector<int> G[MAXN],to[MAXN];

void BFS(int st)
{ // to[i] 表示第 i 个点能走到的位置
    memset(used,-1,sizeof(used)); to[st].clear();
    static int q[MAXN<<2];
    int front=1,tail=1; q[1]=st,used[st]=0;
    while(front<=tail)
    {
        int u=q[front++];
        for(int v: G[u]) 
        {
            if(used[v]!=-1) continue;
            if(used[u]+1>k) continue;
            used[v]=used[u]+1,q[++tail]=v,to[st].pb(v);
        }
    }
}
bool uni(int a, int b, int c, int d)
{
    return a!=b && a!=c && a!=d && b!=c && b!=d && c!=d;
}

signed main()
{
    // freopen("holiday.in","r",stdin);
    // freopen("holiday.out","w",stdout);
    read(n,m,k); k++;
    For(i,2,n) read(val[i]);
    For(i,1,m)
    {
        int x,y;
        read(x,y);
        G[x].pb(y),G[y].pb(x);
    }
    For(i,1,n) BFS(i);
    // cerr<<Sz(to[1])<<endl;
    for(int i: to[1])
    {
        for(int j: to[i])
        {
            if(i==j) continue;
            // 处理前三大
            // f 数组记录值,g 数组记录点
            if(val[i]+val[j]>=f[j][0])
            {
                f[j][2]=f[j][1],g[j][2]=g[j][1];
                f[j][1]=f[j][0],g[j][1]=g[j][0];
                f[j][0]=val[i]+val[j],g[j][0]=i;
            }
            else if(val[i]+val[j]>=f[j][1]) 
            {
                f[j][2]=f[j][1],g[j][2]=g[j][1];
                f[j][1]=val[i]+val[j],g[j][1]=i;
            }
            else if(val[i]+val[j]>=f[j][2])
            {
                f[j][2]=val[i]+val[j],g[j][2]=i;
            }
        }
    }
    ll ans=0;
    For(i,2,n) for(int j: to[i])
    {
        if(i==j) continue;
        For(p,0,2) For(q,0,2)
        {
            if(uni(i,j,g[i][p],g[j][q])) // 4 个点两两不同
            {
                ans=max(ans,f[i][p]+f[j][q]);
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}
2022/11/1 14:38
加载中...