InfOJ AC,洛谷 WA 85 求助
查看原帖
InfOJ AC,洛谷 WA 85 求助
237530
rzh123楼主2022/10/31 07:52

RT。

#include <bits/stdc++.h>
#define gc IO::fastgc()
#define pc(c) IO::fastpc(c)
using namespace std;
typedef long long ll;
constexpr unsigned N=2507,M=20007;
constexpr ll INF=0x3f3f3f3f3f3f3f3f;
int n,m,d;
ll w[N];
vector<int> g[N];
ll dis[N][N],ans;
vector<int> to[N],ss;
inline void bfs(int s){
//	printf("s=%d\n",s);
	for(int i=1;i<=n;++i){
		dis[s][i]=INF;
	}
	queue<int> q;
	dis[s][s]=0;
	q.emplace(s);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(auto v:g[u]){
			if(dis[s][v]!=INF) continue;
			dis[s][v]=dis[s][u]+1;
			q.emplace(v);
		}
	}
}
void init2(){
	for(int i=2;i<=n;++i){
		if(dis[1][i]>d) continue;
		ss.emplace_back(i);
		for(int j=2;j<=n;++j){
			if(j==i) continue;
			if(dis[i][j]<=d){
				to[i].emplace_back(j);
			}
		}
	}
	for(auto i:ss){
		sort(to[i].begin(),to[i].end(),
			[](int a,int b)->bool{
				return w[a]>w[b];
			}
		);
//		for(auto j:to[i]){
//			printf("%d-->%d\n",i,j);
//		}
	}
}
void init4(){
	auto check=[&](int u,int v)->void{
//		printf("check(%d,%d)\n",u,v);
		int su=min((int)to[u].size(),3),sv=min((int)to[v].size(),3);
		for(int i=0;i<su;++i){
			for(int j=0;j<sv;++j){
				int a=to[u][i],b=to[v][j];
				if(a==b||a==u||a==v||b==u||b==v||dis[a][b]>d) continue;
//				printf("check: %d %d %d %d\n",u,a,b,v);
				ans=max(ans,w[u]+w[v]+w[a]+w[b]);
			}
		}
	};
	for(unsigned i=0;i<ss.size();++i){
		for(unsigned j=i+1;j<ss.size();++j){
			check(ss[i],ss[j]);
		}
	}
}
signed main(){
//	freopen("holiday.in","r",stdin);
//	freopen("holiday.out","w",stdout);
	scanf("%d%d%d",&n,&m,&d);
	++d;
	for(int i=2;i<=n;++i){
		scanf("%lld",w+i);
	}
	for(int i=1;i<=m;++i){
		int u,v;
		scanf("%d%d",&u,&v);
		g[u].emplace_back(v),
		g[v].emplace_back(u);
	}
	for(int i=1;i<=n;++i){
		bfs(i);
	}
	init2();
	init4();
	printf("%lld\n",ans);
	return 0;
}

2022/10/31 07:52
加载中...