95分,求调
查看原帖
95分,求调
57755
Happy_Orca楼主2022/11/24 09:32

WA了#11#42
具体想法就是枚举 a,da,d 找符合条件的 b,cb,c
似乎是第28行的问题

#include<bits/stdc++.h>
#define int long long
#define maxe 20005
#define maxn 2505
using namespace std;
int n,m,k,a[maxn],cn[maxn],cnt,ans,f[maxn][10];
bool v[maxn],mp[maxn][maxn];
int tot,lnk[maxn],nxt[maxe],son[maxe];
inline int read(){
	int ret=0;char ch=getchar();
	while(!isdigit(ch)) ch=getchar();
	while(isdigit(ch)) ret=ret*10+ch-'0',ch=getchar();
	return ret;
}
struct str{
	int id,k;
}q[maxn];
bool cmp(int x,int y){
	return a[x]>a[y];
}
void BFS(int u){
	memset(v,0,sizeof v);int t=1,h=0;q[1]=(str){u,-1};v[u]=1;
	while(h!=t){
		h++;if(q[h].k==k) continue;
		for(int j=lnk[q[h].id];j;j=nxt[j]){
			if(v[son[j]]) continue;
			q[++t]=(str){son[j],q[h].k+1},v[son[j]]=1;
			if(son[j]!=1){f[u][5]=son[j];sort(f[u]+1,f[u]+6,cmp),mp[u][son[j]]=1;}
		}
	}
}
void add_e(int x,int y){
	son[++tot]=y,nxt[tot]=lnk[x],lnk[x]=tot;
}
bool check(int a,int b,int c,int d){
	return a!=d&&b!=c&&a!=c&&b!=d&&mp[c][b];
}
signed main(){
	n=read(),m=read(),k=read();
	for(int i=2;i<=n;i++) a[i]=read();
	for(int i=1;i<=m;i++){
		int x=read(),y=read();
		add_e(x,y),add_e(y,x);
	}
	for(int i=1;i<=n;i++) BFS(i);
	for(int i=2;i<=n;i++) if(mp[1][i]) cn[++cnt]=i;
	for(int i=1;i<=cnt;i++)
	for(int j=1;j<=cnt;j++){
		if(cn[i]==cn[j]) continue;
		for(int l=1;l<=4;l++){
			if(f[cn[i]][l]==0) break;
			for(int k=1;k<=4;k++){
				if(f[cn[j]][k]==0) break;
				if(check(cn[i],f[cn[i]][l],f[cn[j]][k],cn[j])) ans=max(ans,a[cn[i]]+a[cn[j]]+a[f[cn[i]][l]]+a[f[cn[j]][k]]);
			}
		}
	}printf("%lld\n",ans);
	return 0;
}
2022/11/24 09:32
加载中...