n4卡时 80pts求助
查看原帖
n4卡时 80pts求助
270854
二叉苹果树楼主2022/10/31 11:03
#include<bits/stdc++.h>
using namespace std;
inline long long read()
{
    long long 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;
long long x[MAXN];
struct edge
{
    int v,w;
};
bool cmp(edge a,edge b)
{
    return a.w>b.w;
}
unsigned long long ans;
int cnt;
bool Vis[MAXN]={1,1};
vector<edge>E[MAXN];
struct node 
{
    int dis,u;
    bool operator<(const node& a) const {return dis>a.dis;}
};
bool f[MAXN][MAXN];
int dis[MAXN],vis[MAXN];
priority_queue<node>q;
vector<edge>e[MAXN];
void dijkstra(int n,int s)
{
    for(int i=1;i<=n;i++)
        dis[i]=0x3f3f3f3f,vis[i]=false;
    dis[s]=0;
    q.push((node){0,s});
    while(!q.empty())
    {
        int u=q.top().u;
        q.pop();
        if(vis[u])
            continue;
        vis[u]=true;
        for(int j=0;j<e[u].size();j++)
        {
            edge ed=e[u][j];
            int v=ed.v,w=ed.w;
            if(dis[v]>dis[u]+w)
                dis[v]=dis[u]+w,q.push((node){dis[v],v});
        }
    }   
}
void dfs(int s,int k,unsigned long long sum)
{
    ++cnt;
    if(cnt==30000000)
    {
        printf("%lld\n",ans);
        exit(0);
    }
    if(k==5)
    {
        ans=max(ans,sum);
        return ;
    }
    int len=E[s].size();
    for(int i=0;i<len;i++)
    {
        int v=E[s][i].v;
        if(!Vis[v]&&(k!=4||(k==4&&f[1][v])))
        {
            Vis[v]=1;
            dfs(v,k+1,sum+x[v]);
            Vis[v]=0;
        }
    }
}
int main()
{
    n=read(),m=read(),K=read();
    for(int i=2;i<=n;i++)
        x[i]=read();
    for(int i=1;i<=m;i++)
    {
        int u,v;
        u=read(),v=read();
        e[u].push_back((edge){v,1});
        e[v].push_back((edge){u,1});

    }
    for(int i=1;i<=n;i++)
    {
        dijkstra(n,i);
        for(int j=1;j<=n;j++)
            if(dis[j]!=0x3f3f3f3f&&dis[j]-1<=K)
                f[i][j]=1,E[i].push_back((edge){j,x[j]});
        sort(E[i].begin(),E[i].end(),cmp);
    }
    dfs(1,1,0);
    printf("%lld\n",ans);
    return 0;
}
2022/10/31 11:03
加载中...