100pts,但是民间数据wa了,求调
查看原帖
100pts,但是民间数据wa了,求调
261574
rmzls楼主2023/5/19 21:50

Subtask #1 #9 WA

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2600,W=200005,M=6250000;
int n,m,k,d[N][N],cnt,nxt[M],to[M],head[N],w[N],fcnt,fnxt[W],fto[W],fhead[N],ans,sum;
int mx[N],mxid[N],cmx[N],cmxid[N],tmx[N],tmxid[N],ish[N],u,v,vis[N],fx,fy;
void mem(){
	for(int i=1;i<=n;i++){
		vis[i]=0;
	}
}
void fadd(int u,int v){
	fto[++fcnt]=v;
	fnxt[fcnt]=fhead[u];
	fhead[u]=fcnt;
}
void add(int u,int v){
	to[++cnt]=v;
	nxt[cnt]=head[u];
	head[u]=cnt;
}
vector<int>A;
vector<int>B;
queue<int>q;
void bfs(int a){
	mem();
	q.push(a);d[a][a]=0;vis[a]=1;
	while(!q.empty()){
		int x=q.front();q.pop();
		for(int i=fhead[x];i;i=fnxt[i]){
			int y=fto[i];
			if(vis[y]){
				continue;
			}
			vis[y]=1;
			d[a][y]=d[a][x]+1;
			q.push(y);
		}
	}
}
signed main(){
	scanf("%lld%lld%lld",&n,&m,&k);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			d[i][j]=INT_MAX;
		}
	}
	for(int i=2;i<=n;i++){
		scanf("%lld",&w[i]);
	}
	for(int i=1;i<=m;i++){
		scanf("%lld%lld",&u,&v);
		fadd(u,v);
		fadd(v,u);
	}
	for(int i=1;i<=n;i++){
		bfs(i);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(i==j){
				continue;
			}
			if(d[i][j]<=k+1){
				add(i,j);
			}
		}
	}
	mem();
	for(int i=head[1];i;i=nxt[i]){
		int y=to[i];
		if(vis[y]){
			continue;
		}
		vis[y]=1;ish[y]=1;
		A.push_back(y);
	}
	mem();
	for(int j=0;j<A.size();j++){
		int x=A[j];
		for(int i=head[x];i;i=nxt[i]){
			int y=to[i];
			if(vis[y]||y==1){
				continue;
			}
			vis[y]=1;
			B.push_back(y);
		}
	}
	mem();
	for(int j=0;j<B.size();j++){
		int x=B[j];
		for(int i=head[x];i;i=nxt[i]){
			int y=to[i];
			if(ish[y]){
				if(w[y]>=mx[x]){
					tmxid[x]=cmxid[x];
					tmx[x]=cmx[x];
					cmxid[x]=mxid[x];
					cmx[x]=mx[x];
					mxid[x]=y;
					mx[x]=w[y];
				}
				else if(w[y]>=cmx[x]){
					tmxid[x]=cmxid[x];
					tmx[x]=cmx[x];
					cmxid[x]=y;
					cmx[x]=w[y];
				}
				else if(w[y]>=tmx[x]){
					tmxid[x]=y;
					tmx[x]=w[y];
				}
			}
		}
	}
	for(int i=0;i<B.size();i++){
		for(int j=0;j<B.size();j++){
			if(i==j||d[B[i]][B[j]]>k+1){
				continue;
			}
			sum=0;fx=fy=0;
			int x=B[i],y=B[j];
			if(mx[x]==mx[y]&&mx[y]==0){
				continue;
			}
			if(mxid[x]==y){
				fx=1;
				swap(mxid[x],cmxid[x]);swap(cmxid[x],tmxid[x]);
				swap(mx[x],cmx[x]);swap(cmx[x],tmx[x]);
			}
			if(cmxid[x]==y){
				fx=2;
				swap(cmxid[x],tmxid[x]);swap(cmx[x],tmx[x]);
			}
			if(mxid[y]==x){
				fy=1;
				swap(mxid[y],cmxid[y]);swap(cmxid[y],tmxid[y]);
				swap(mx[y],cmx[y]);swap(cmx[y],tmx[y]);
			}
			if(cmxid[y]==x){
				fy=2;
				swap(cmxid[y],tmxid[y]);swap(cmx[y],tmx[y]);
			}
			if(mxid[x]!=mxid[y]){
				ans=max(ans,mx[x]+w[x]+w[y]+mx[y]);
			}
			else{
				if(cmx[x]==cmx[y]&&cmx[y]==0){
					continue;
				}
				sum=max(mx[x]+cmx[y],cmx[x]+mx[y]);
				ans=max(ans,sum+w[x]+w[y]);
			}
			if(fx==1){
				swap(cmxid[x],tmxid[x]);swap(mxid[x],cmxid[x]);
				swap(cmx[x],tmx[x]);swap(mx[x],cmx[x]);
			}
			if(fx==2){
				swap(cmxid[x],tmxid[x]);swap(cmx[x],tmx[x]);
			}
			if(fy==1){
				swap(cmxid[y],tmxid[y]);swap(mxid[y],cmxid[y]);
				swap(cmx[y],tmx[y]);swap(mx[y],cmx[y]);
			}
			if(fy==2){
				swap(cmxid[y],tmxid[y]);swap(cmx[y],tmx[y]);
			}
		}
	}
	printf("%lld",ans);
	return 0;
}
2023/5/19 21:50
加载中...