25pts求调
查看原帖
25pts求调
252549
Iwara楼主2023/12/14 13:48

RT

#include<bits/stdc++.h>
#include<queue>
using namespace std;
typedef long long ll;
const ll MAXN=2505,MAXM=2e4+5;
ll n,m,k,x,y;
ll w[MAXN];
struct edge{
	ll u,v,nxt;
}e[MAXM];
ll head[MAXN],edge_num;
void add_edge(ll From,ll To){
	edge_num++;
	e[edge_num].u=From;
	e[edge_num].v=To;
	e[edge_num].nxt=head[From];
	head[From]=edge_num;
	return;
}
ll dis[MAXN][MAXN];
bool vis[MAXN];
queue<ll> q;
void pre_dis(ll st){
	q.push(st);
	dis[st][st]=0;
	for(int i=1;i<=n;i++)vis[i]=0;
	while(q.size()){
		ll now=q.front();
		vis[now]=1;
		q.pop();
		for(int i=head[now];i;i=e[i].nxt){
			if(!vis[e[i].v]){
				dis[st][e[i].v]=dis[e[i].v][st]=dis[st][now]+1;
				q.push(e[i].v);
			}
		}
	}
	return;
}
ll pre[MAXN][3];
bool check(ll A,ll B,ll C,ll D){
	if(A&&B&&C&&D&&A!=B&&A!=C&&A!=D&&B!=C&&B!=D&&C!=D&&dis[1][A]<=k+1&&dis[A][B]<=k+1&&dis[B][C]<=k+1&&dis[C][D]<=k+1&&dis[D][1]<=k+1)return 1;
	return 0;
}
int main(){
	cin>>n>>m>>k;
	for(int i=2;i<=n;i++)cin>>w[i];
	for(int i=1;i<=m;i++){
		cin>>x>>y;
		add_edge(x,y);
		add_edge(y,x);
	}
	for(int i=1;i<=n;i++)pre_dis(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||dis[i][j]>k+1)continue;
			if(w[j]>w[pre[i][0]])pre[i][2]=pre[i][1],pre[i][1]=pre[i][0],pre[i][0]=j;
			else if(w[j]>w[pre[i][1]])pre[i][2]=pre[i][1],pre[i][1]=j;
			else if(w[j]>w[pre[i][2]])pre[i][2]=j;
		}
	}
	ll ans=0;
	for(int i=2;i<=n;i++){
		for(int j=2;j<=n;j++){
			if(dis[i][j]>k+1)continue;
			for(int bb=0;bb<3;bb++){
				for(int cc=0;cc<3;cc++){
					if(check(pre[i][bb],i,j,pre[j][cc]))ans=max(ans,w[i]+w[j]+w[pre[i][bb]]+w[pre[j][cc]]);
				} 
			}
		} 
	}
	cout<<ans;
	return 0;
}

看不出哪有问题

2023/12/14 13:48
加载中...