70pts求助
查看原帖
70pts求助
590392
caiwen楼主2022/11/23 21:10

先bfs找每个点能到达的点。排序取前3大。最后6个点wa,看了半天都没找出毛病来...

#include<bits/stdc++.h>
#define int long long
#define _ 2505
#define ull unsigned long long
#define lb long double
#define ls(k) (k)<<1
#define rs(k) (k)<<1|1
using namespace std;
const int mod=0;

inline int read(){
	int res=0,ch=getchar(),f=1;
	while(!isdigit(ch) and ch!=EOF){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(isdigit(ch)){
		res=(res<<3)+(res<<1)+(ch-'0');
		ch=getchar();
	}
	return res*f;
}

int n,m,k,w[_],ok[_][_];
struct Edge{int next,to;} edge[_<<1];
int head[_],size;
inline void add(int u,int v){edge[++size].to=v,edge[size].next=head[u],head[u]=size;}

int vis[_];
typedef pair<int,int> pii;
inline void bfs(int x){
	queue<pii> q;
	memset(vis,0,sizeof(vis));
	q.push(pii(x,0));
	while(!q.empty()){
		int now=q.front().first;
		int dis=q.front().second;
		q.pop();vis[now]=true;
		if(dis<=k+1) ok[x][now]=ok[now][x]=true;
		else continue;
		for(int i=head[now];i;i=edge[i].next){
			int to=edge[i].to;
			if(vis[to]) continue;
			q.push(pii(to,dis+1));
		}
	}
}

vector<pii> ve[_];

signed main(){
	//freopen("holiday.in","r",stdin);
	//freopen("holiday.out","w",stdout);
	n=read(),m=read(),k=read();
	for(int i=2;i<=n;i++) w[i]=read();
	for(int i=1,u,v;i<=m;i++) u=read(),v=read(),add(u,v),add(v,u);
	for(int i=1;i<=n;i++) bfs(i);
	for(int i=2;i<=n;i++){
		for(int j=2;j<=n;j++){
			if(j==i) continue;
			if(ok[1][j]&&ok[j][i]){
				int nw=w[j]+w[i];
				ve[i].push_back(pii(j,nw));
				sort(ve[i].begin(),ve[i].end(),[](pii a,pii b){return a.second>b.second;});
				if(ve[i].size()>3) ve[i].erase(--ve[i].end());
			}
		}
	}
	int ans=0;
	for(int b=2;b<=n;b++){
		for(int c=2;c<=n;c++){
			if(b==c||(!ok[b][c])) continue;
			for(pii i:ve[b]){
				for(pii j:ve[c]){
					int a=i.first,d=j.first;
					if(a==c||a==d||b==d) continue;
					ans=max(ans,w[a]+w[b]+w[c]+w[d]);
				}
			}
		}
	}
	cout<<ans<<endl;
	return 0;
} 
2022/11/23 21:10
加载中...