真的服了90pts求调啊啊啊啊
查看原帖
真的服了90pts求调啊啊啊啊
501947
DengDuck鄧德楼主2023/3/4 15:22

至少交了10遍了,为了测试还交过题解

真的服了,再这样下去我会像lty一样疯狂嗯造二锅头死了。

#include<bits/stdc++.h>
using namespace std;
long long n,m,k,tot,x,y,f[2505][2505],s[2505],h[2505],c[2505][11],ans;
vector<long long>v;
struct node
{
    long long v,nxt;
}a[300005];
void add(long long x,long long y)
{
    tot++;
    a[tot].v=y;
    a[tot].nxt=h[x];
    h[x]=tot;
}
queue<long long>q;
void bfs(long long x)
{
    f[x][x]=0;
    while(!q.empty())q.pop();
    q.push(x);
    while(!q.empty())
    {
        long long t=q.front();
        q.pop();
        for(int i=h[t];i;i=a[i].nxt)
        if(f[x][a[i].v]>f[x][t]+1)
        {
            f[x][a[i].v]=f[x][t]+1;
            if(f[x][a[i].v]<=k)q.push(a[i].v); 
        }
    }
}
bool cmp(long long x,long long y)
{
    return s[x]>s[y];
}
int main()
{
    scanf("%lld%lld%lld",&n,&m,&k);
    k++;
    memset(f,127,sizeof(f));
    for(int i=2;i<=n;i++)scanf("%lld",&s[i]);
    for(int i=1;i<=m;i++)
    {
        scanf("%lld%lld",&x,&y);
        add(y,x),add(x,y); 
    }
    for(int i=1;i<=n;i++)bfs(i); 
    for(int i=2;i<=n;i++) 
    {
    	v.clear(); 
    	for(int j=2;j<=n;j++)
    	{
    		if(i==j)continue;
    		if(f[1][j]<=k&&f[j][i]<=k)v.push_back(j);
    	}
    	sort(v.begin(),v.end(),cmp);
    	for(int j:v)
    	{
    		c[i][++c[i][0]]=j;
    		if(c[i][0]>=3)break;
    	}
    }
    for(int i=2;i<=n;i++)
	for(int j=i+1;j<=n;j++)
	{
		if(f[i][j]>k)continue;
		for(int u:c[i])	
		{
			if(!u)break; 
			for(int v:c[j])
			{
				if(!v)break;
				if(u!=v&&v!=i&&u!=j)ans=max(ans,s[i]+s[j]+s[u]+s[v]);
			}			
		}

		
	}
    printf("%lld",ans);
    return 0;
}
2023/3/4 15:22
加载中...