S组
查看原帖
S组
270854
二叉苹果树楼主2022/10/30 03:05

T1

暴力

过了样例,但是WA+TLE

期望AC+TLE

T2 超级大分讨行不行

记录最大最小值,以及判断0

会很复杂

T1:

 #include<bits/stdc++.h>
using namespace std;
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(!isdigit(ch))
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(isdigit(ch))
    {
        x=(x<<1)+(x<<3)+ch-'0';
        ch=getchar();
    }
    return x*f;
}
const int MAXN=2505;
int n,m,K;
int x[MAXN];
int f[MAXN][MAXN];
struct node 
{
    int v,w;
};
int ans;

bool vis[MAXN]={1,1};
vector<node>e[MAXN];
void dfs(int s,int k,int sum)
{
    if(k==5)
    {
        ans=max(ans,sum);
        return ;
    }
    for(int i=0;i<e[s].size();i++)
    {
        int v=e[s][i].v;
        if(!vis[v]&&(k!=4||(k==4&&f[1][v]!=0x3f3f3f3f)))
        {
            vis[v]=1;
            dfs(v,k+1,sum+x[v]);
            vis[v]=0;
        }
    }
}
int main()
{
    n=read(),m=read(),K=read();
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            f[i][j]=0x3f3f3f3f;
    for(int i=2;i<=n;i++)
        f[i][i]=0,x[i]=read();
    for(int i=1;i<=m;i++)
    {
        int u,v;
        u=read(),v=read();
        f[u][v]=f[v][u]=1;
    }
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(f[i][k]!=0&&f[k][j]!=0)
                    f[i][j]=f[j][i]=min(f[i][j],f[i][k]+f[k][j]);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
                if(f[i][j]!=0)
                {
                    if(--f[i][j]<=K)
                        e[i].push_back((node){j,x[j]});
                    else
                        f[i][j]=0x3f3f3f3f;
                }
    // for(int i=1;i<=n;i++)
    // {
    //     for(int j=0;j<e[i].size();j++)
    //         printf("%d->%d=%d\n",i,e[i][j].v,f[i][e[i][j].v]);
    //     printf("\n");
    // }
    dfs(1,1,0);
    printf("%d\n",ans);
    return 0;
}
2022/10/30 03:05
加载中...