CCF数据最后一个点TLE求助
查看原帖
CCF数据最后一个点TLE求助
359270
是青白呀白鸽子楼主2022/11/8 17:21

rt,只T了CCF的最后一个点和sub1的18/20两个点。

#include<bits/stdc++.h>
using namespace std;
const int N=2505,M=10005;
int n,m,k;
long long a[N];
struct edge{
	int to,next;
}e[2*M];
int fir[N],np=0;
bool vis[N],con[N][N];
inline void add(int x,int y){
	e[++np]=(edge){y,fir[x]};
	fir[x]=np;
}
void bfs(int x){
	int dep=0;
	queue<int>q;
	q.push(x);
	vis[x]=1;
	while(!q.empty()&&dep<=k+1){
		int len=q.size();
		for(int i=1;i<=len;i++){
			int y=q.front();
			q.pop();
			con[x][y]=1;
			con[y][x]=1;
			vis[y]=1;
			for(int j=fir[y];j;j=e[j].next){
				if(vis[e[j].to])continue;
				q.push(e[j].to);
		    }
		}
		dep++;
	}
}
int maxn[N][6];//1 2 3记录下标 
int main(){
//	freopen("holiday.in","r",stdin);
//	freopen("holiday.out","w",stdout);
	scanf("%d%d%d",&n,&m,&k);
	for(int i=2;i<=n;i++)
	    scanf("%lld",&a[i]);
	for(int i=1;i<=m;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);
		add(y,x);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++)
		    vis[j]=0;
		bfs(i);
	}
	for(int i=2;i<=n;i++){
		for(int j=2;j<=n;j++){
			if(i==j||!con[i][j]||!con[1][j])continue;
			if(a[j]<=a[maxn[i][3]])continue;
	    	for(int k=3;k>=1;k--){
		    	if(a[j]>a[maxn[i][k]])maxn[i][k+1]=maxn[i][k];
		    	if(a[j]<=a[maxn[i][k-1]]||k==1){
		    		maxn[i][k]=j;
	    			break;
	    		}
	    	}
		}
	}
	long long ans=0;
	for(int b=2;b<=n;b++){
		for(int c=b+1;c<=n;c++){
			if(b==c||!con[b][c])continue;
			for(int A=1;A<=3;A++){
				if(maxn[b][A]==c||!maxn[b][A])continue;
				for(int d=1;d<=3;d++){
					if(maxn[c][d]==b||maxn[c][d]==maxn[b][A]||!maxn[c][d])continue;
					ans=max(ans,a[b]+a[c]+a[maxn[b][A]]+a[maxn[c][d]]);
				}
			}
		}
	}
	printf("%lld",ans);
	return 0;
}
2022/11/8 17:21
加载中...