考场过不了第3个样例,洛谷上AC,Infoj 85pts,求Hack
查看原帖
考场过不了第3个样例,洛谷上AC,Infoj 85pts,求Hack
419144
luckydrawbox楼主2022/11/2 13:41
#include<bits/stdc++.h>
#define ll long long
using namespace std;
long long read(){
	long long x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
void write(long long x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
const int N=2510,M=10010;
int n,m,k;
int head[N],ver[M<<1],nxt[M<<1],tot;
void add(int x,int y){
	ver[++tot]=y;
	nxt[tot]=head[x];
	head[x]=tot;
}
int v[N],a[N][N],ch[N][3];
ll w[N],c[N][3],ans;
void dfs(int x,int dep){
	if(dep==k)
		return;
	for(int i=head[x];i;i=nxt[i]){
		int y=ver[i];
		if(v[y])
			continue;
		v[y]=1;
		dfs(y,dep+1);
	}
}
void down(int x,int y){
	for(int i=2;i>y;i--)
		c[x][i]=c[x][i-1],ch[x][i]=ch[x][i-1];
}
int main(){
	n=read();m=read();k=read();
	for(int i=2;i<=n;i++)
		w[i]=read();
	for(int i=1;i<=m;i++){
		int u,V;
		u=read();V=read();
		add(u,V);
		add(V,u);
	}
	for(int i=1;i<=n;i++){
		memset(v,0,sizeof(v));
		v[i]=1;
		dfs(i,-1);
		for(int j=1;j<=n;j++)
			a[i][j]=v[j];
	}
	for(int i=2;i<=n;i++){
		for(int j=2;j<=n;j++){
			//cout<<a[i][j]<<" ";
			if(i==j||(!a[1][i])||(!a[i][j]))
				continue;
			for(int p=0;p<3;p++){
				if(w[i]+w[j]>=c[j][p]){
					down(j,p);
					c[j][p]=w[i]+w[j];
					ch[j][p]=i;
					break;
				}
			}
		}
		//cout<<endl;
	}
	for(int i=2;i<=n;i++){
		/*cout<<i<<" choose:"<<endl;
		for(int j=0;j<3;j++){
			printf("(%d,%lld) ",ch[i][j],c[i][j]);
		}
		puts("");*/
		for(int j=2;j<=n;j++){
			if(i==j||(!a[i][j])||(!ch[i][0])||(!ch[j][0]))
				continue;
			for(int p=0;p<3;p++){
				if(j==ch[i][p])
					continue;
				for(int q=0;q<3;q++){
					if(i==ch[j][q]||ch[i][p]==ch[j][q])
						continue;
					ans=max(ans,c[i][p]+c[j][q]);
				}
			}
		}
	}
	write(ans);
	return 0;
}
2022/11/2 13:41
加载中...