另类做法民间数据WA求调
查看原帖
另类做法民间数据WA求调
490694
Compound_Interest楼主2022/11/20 08:28
#include<cstdio>
#include<algorithm>
#include<cstring> 
#include<queue>
#include<ctime>
#include<random>
#include<cstdlib>
#define int long long 
using namespace std;
const int maxn=2510;
const int maxm=1e7;
int head[maxn],cnt=1,n,m,k,dp[maxn],dis[maxn][maxn],c[maxn],a[maxn],ans;
bool vis[maxn];
queue<int>q;
struct node{
    int to,nxt;
}e[maxm],ee[maxm];
void add(int u,int v,int op){
   if(op==1) e[cnt].to=v,e[cnt].nxt=head[u],head[u]=cnt++;
   else ee[cnt].to=v,ee[cnt].nxt=head[u],head[u]=cnt++;
}
int dfs(int u,int d){
    if(d==4)
        return dp[u]=(dis[1][u]<=k+1)?a[u]:-5e18;
    if(~dp[u]) return dp[u];
    int ret=-5e18;
    for(int i=head[u];i;i=ee[i].nxt){
        int v=ee[i].to;
        if(c[v]==d+1) ret=max(ret,dfs(v,d+1)+a[u]);
    }
    return dp[u]=ret;
}
void bfs(int s){
    memset(vis,0,sizeof(vis));
    dis[s][s]=0;
    q.push(s),vis[s]=1;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        for(int i=head[u];i;i=e[i].nxt){
            int v=e[i].to;
            if(!vis[v])
                dis[s][v]=dis[s][u]+1,vis[v]=1,q.push(v);
        }
    }
} 
signed main(){
    mt19937 myrd(time(0));
    scanf("%lld%lld%lld",&n,&m,&k);
    for(int i=2;i<=n;i++) scanf("%lld",&a[i]);
    for(int i=1;i<=m;i++){
        int u,v;scanf("%lld%lld",&u,&v);
        add(u,v,1),add(v,u,1);
    }
    memset(dis,0x3f,sizeof(dis));
    for(int i=1;i<=n;i++) bfs(i);
    memset(head,0,sizeof(head));
    cnt=1;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        if(dis[i][j]<=k+1&&i!=j) add(i,j,2);
    while((double)clock()/CLOCKS_PER_SEC<=1.90){
        memset(dp,-1,sizeof(dp));
        for(int i=2;i<=n;i++) c[i]=myrd()%4+1;
        dfs(1,0);
        ans=max(ans,dp[1]);
    }
    printf("%lld",ans);
    return 0;
}
2022/11/20 08:28
加载中...