数据过水……
查看原帖
数据过水……
596903
JoestarJX的小丑楼主2022/11/1 20:05
#include<bits/stdc++.h>
using namespace std;
const int N=5000;
typedef long long ll;
int n,m,k,fl[N][N],vis[N],vis2[N];
ll s[N],ans;
vector<int>G[N];
struct node{
	ll w[4];
	int r[4];
}md[N];
queue<pair<int,int> >q;
void bfs(int em){
	memset(vis,0,sizeof(vis));
//	memset(vis2,0,sizeof(vis2));
	q.push(make_pair(em,0));
	vis[em]=1;
//	vis2[em]=1;
	while(q.size()){
		int u=q.front().first,w=q.front().second;
		q.pop();
		for(int i=0;i<G[u].size();i++){
			int v=G[u][i];
			fl[em][v]=1;
//			if(u==em) vis2[v]=1;
//			if(!vis2[v]) G[em].push_back(v);
//			vis2[v]=1;
			if(w<k&&(!vis[v])) q.push(make_pair(v,w+1)),vis[v]=1; 
		}
	}
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=2;i<=n;i++) scanf("%lld",&s[i]);
	for(int i=1;i<=m;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		G[x].push_back(y);
		G[y].push_back(x);
	}
	for(int i=1;i<=n;i++) bfs(i);
	for(int i=2;i<=n;i++){
		for(int j=2;j<=n;j++){
			if(i==j) continue;
			if(fl[1][i]&&fl[i][j]){
				ll sum=s[i]+s[j];
				if(sum>md[j].w[1]){
					md[j].w[3]=md[j].w[2],md[j].r[3]=md[j].r[2];//这行不要可ac 
					md[j].w[2]=md[j].w[1],md[j].r[2]=md[j].r[1];//还有这行 
					md[j].w[1]=sum,md[j].r[1]=i;	
				}
				else if(sum>md[j].w[2]){
					md[j].w[3]=md[j].w[2],md[j].r[3]=md[j].r[2];//还有这行 
					md[j].w[2]=sum,md[j].r[2]=i;
				}
				else if(sum>md[j].w[3]) md[j].w[3]=sum,md[j].r[3]=i;
			}
		}
	}
	for(int i=2;i<=n;i++){
		for(int j=2;j<=n;j++){
			if(i==j||fl[i][j]==0) continue;
			for(int m1=1;m1<=3;m1++){
				for(int m2=1;m2<=3;m2++){
					if(md[i].r[m1]!=md[j].r[m2]&&md[i].r[m1]!=j&&i!=md[j].r[m2]&&md[i].r[m1]&&md[j].r[m2]) ans=max(ans,md[i].w[m1]+md[j].w[m2]);
				}
			}
		}
	}
	printf("%lld",ans);
	return 0;
} 

让我当了小丑好吧……

2022/11/1 20:05
加载中...