样例全过,仅有60,问题是……
查看原帖
样例全过,仅有60,问题是……
751546
wenyutao1楼主2023/8/21 14:24
#include<bits/stdc++.h>
using namespace std;
const int N=2053,M=10003,INF=0x3f3f3f3f;
int vis[N],n,m,k,w[N],f[N][5],first[N],tot=0,dis[N][N],ans=0;
struct node{
	int v,ne;
}e[M<<1];
void add(int u,int v){
	e[++tot]=(node){v,first[u]};first[u]=tot;
}
void bfs(int stt){
	queue<pair<int,int> > q;
	for(int i=1;i<=n;++i) dis[stt][i]=INF,vis[i]=0;
	dis[stt][stt]=0;
	vis[stt]=1;q.push(make_pair(stt,0));
	while(!q.empty()){
		int u=q.front().first,step=q.front().second;
		q.pop();
		for(int i=first[u];i;i=e[i].ne){
			int v=e[i].v;
			if(!vis[v]){
				dis[stt][v]=step+1;
				vis[v]=1;
				q.push(make_pair(v,step+1));
			}
		}
	}
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	w[0]=-INF;
	for(int i=2;i<=n;++i) scanf("%d",&w[i]);
	for(int i=1;i<=m;++i){
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v);add(v,u);
	}
	for(int i=1;i<=n;++i) bfs(i);
	memset(f,0,sizeof(f));
	for(int i=2;i<=n;++i){
		for(int j=2;j<=n;++j){
			if(i==j) continue;
			if(dis[i][j]<=k+1&&dis[1][j]<=k+1){
				if(w[j]>w[f[i][1]]) swap(f[i][2],f[i][3]),swap(f[i][1],f[i][2]),f[i][1]=j;
				else if(w[j]>w[f[i][2]]) swap(f[i][2],f[i][3]),f[i][2]=j;
				else if(w[j]>w[f[i][3]]) f[i][3]=j;
			}
		}
	}
	for(int i=2;i<=n;++i){
		for(int j=2;j<=n;++j){
			if(i==j||dis[i][j]>k+1) continue;
			int k2=i,k3=j,s1=1,s2=1,k1=f[k2][s1],k4=f[k3][s2];
			if(k1==k3) k1=f[k2][++s1];
			if(k4==k2) k4=f[k3][++s2];
			if(k1==k4){
				if(w[f[k2][s1+1]]>=w[f[k3][s2+1]]) k4=f[k3][++s2];
				else k1=f[k2][++s1];
			}
			if(!k1||!k4) continue;
			ans=max(ans,w[k1]+w[k2]+w[k3]+w[k4]);
		} 
	}
	printf("%d",ans);
	return 0;
} 

有无巨佬垂青,指点一二。

2023/8/21 14:24
加载中...