Subtask #1 #17WA求助
查看原帖
Subtask #1 #17WA求助
458493
__BAI__楼主2022/11/25 20:43
#include<bits/stdc++.h>
#define int long long
using namespace std;
long long read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-'){
			f=-1;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
struct a{
    int maxn[3],d[3];
}f[2505];
int n,m,k,ans;
int point[2505];
vector<int> p[2505];
bool dis[2505][2505];
bool vis[2505];
void bfs(int di){
    memset(vis,0,sizeof(vis));
    vis[di]=1;
    queue<pair<int,int> >q;
    q.push(make_pair(di,0));
    while(q.size()){
        int dd=q.front().first,kk=q.front().second;
        q.pop();
        int l=p[dd].size();
        vis[dd]=1;
        dis[di][dd]=1;
        dis[dd][di]=1;
        if(kk<k){
            for(int i=0;i<l;i++){
                int s=p[dd][i];
                if(vis[s]==0){
                    vis[s]=1;
                    q.push(make_pair(s,kk+1));
                }
            }
        }
    }
}
signed main(){
    n=read(),m=read(),k=read();
    k++;
    for(int i=2;i<=n;i++)point[i]=read();
    while(m--){
        int x,y;
        x=read(),y=read();
        p[x].push_back(y);
        p[y].push_back(x);
    }
    for(int i=1;i<=n;i++)bfs(i);
    /*for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
            cout<<dis[i][j]<<" ";
        cout<<endl;
    }*/
    for(int i=2;i<=n;i++){
        for(int j=2;j<=n;j++){
            if(i!=j and dis[i][j]==1 and dis[1][j]==1){
                if(point[i]+point[j]>f[i].maxn[0]){
                    f[i].maxn[2]=f[i].maxn[1];
                    f[i].d[2]=f[i].d[1];
                    f[i].d[1]=f[i].d[0];
                    f[i].maxn[1]=f[i].maxn[0];
                    f[i].maxn[0]=point[i]+point[j];
                    f[i].d[0]=j;
                }else if(point[i]+point[j]>f[i].maxn[1]){
                    f[i].maxn[2]=f[i].maxn[1];
                    f[i].d[2]=f[i].d[1];
                    f[i].d[1]=j;
                    f[i].maxn[1]=point[i]+point[j];
                }else if(point[i]+point[j]>f[i].maxn[2]){
                    f[i].maxn[2]=point[i]+point[j];
                    f[i].d[2]=j;
                }
            }
        }
    }
    for(int i=2;i<=n;i++){
        for(int j=2;j<=n;j++){
            if(i!=j and dis[i][j]==1){
            	for(int i1=0;i1<=2;i1++){
            		for(int j1=0;j1<=2;j1++){
            			int x=f[i].d[i1];
            			int y=f[j].d[j1];
            			if(x!=j&&x!=y&&y!=i)ans=max(ans,f[i].maxn[i1]+f[j].maxn[j1]);
					}
				}
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}
2022/11/25 20:43
加载中...