求调
查看原帖
求调
1268398
BeTheNorthStar楼主2024/10/12 16:21

《100pts求调》,WA一个点

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2505,maxm=200005;
int n,m,K,lnk[maxn],tot,que[maxn],dis[maxn][maxn],w[maxn];
bool vis[maxn],p[maxn];
int a[maxn][maxn],len[maxn],Ans;
struct edge{
	int to,nxt;
}e[maxm];
int read(){
	int ret=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-') f=-f;ch=getchar();}
	while(isdigit(ch)) ret=(ret<<3)+(ret<<1)+(ch&15),ch=getchar();
	return ret*f;
}
void add_e(int x,int y){e[++tot]=(edge){y,lnk[x]},lnk[x]=tot;}
void BFS(int x){
	int hed=0,til=1;que[til]=x,vis[x]=1,dis[x][x]=0;
	while((hed!=til)){
		if(dis[x][que[++hed]]>=K) break;
		for(int j=lnk[que[hed]];j;j=e[j].nxt)
	 	  if(!vis[e[j].to]) que[++til]=e[j].to,vis[e[j].to]=1,dis[x][e[j].to]=dis[x][que[hed]]+1;
	}
	if(x==1){for(int i=2;i<=til;i++) p[que[i]]=1;}
	for(int i=1;i<=til;i++) vis[que[i]]=0;
	if(x!=1) for(int i=2;i<=til;i++) if(p[que[i]]){
		a[x][++len[x]]=que[i];
	}
}
void Exmax(int &x,int y){if(y>x) x=y;}
bool cmp(int x,int y){return w[x]>w[y];}
signed main(){
// 	freopen("holiday.in","r",stdin);
// 	freopen("holiday.out","w",stdout);
	memset(dis,63,sizeof dis);
	n=read(),m=read(),K=read()+1;
	for(int i=2;i<=n;i++) w[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++) sort(a[i]+1,a[i]+1+len[i],cmp);
	for(int i=2;i<n;i++)
	for(int j=i+1;j<=n;j++)if(dis[i][j]!=dis[0][0]){
		int k=1,l=1;
		while(1){
			if(k>len[i]||l>len[j]) break;
			if(i==a[j][l]||j==a[i][k]||a[i][k]==a[j][l]){
				if(i==a[j][l]) l++;else
				if(j==a[i][k]) k++;else
				if(k== len[i]) l++;else
				if(l== len[j]) k++;else
				if(w[a[j][l+1]]+w[a[i][k]]>w[a[j][l]]+w[a[i][k+1]]) l++;else k++;
			}else{Exmax(Ans,w[i]+w[j]+w[a[j][l]]+w[a[i][k]]);break;}
		}
	}printf("%lld\n",Ans);
	return 0;
}
2024/10/12 16:21
加载中...