WA 60pts 求调
查看原帖
WA 60pts 求调
204238
MikeC楼主2022/11/17 21:52
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,k;
int a[25001];
struct egde{
	int to;
	int nxt;
}e[100001];
int head[100001],cnt;
void add(int x,int y){
	e[++cnt].to=y;
	e[cnt].nxt=head[x];
	head[x]=cnt;
}
int dis[3001][3001];
priority_queue<pair<int,int> > p[3001];
void dij(int x){
	dis[x][x]=0;
	priority_queue<pair<int,int> > q;
	q.push(make_pair(0,x));
	while(q.size()){
		int now=q.top().second;
		q.pop();
		for(int i=head[now];i;i=e[i].nxt){
			int y=e[i].to;
			if(dis[x][y]>dis[x][now]+1){
				dis[x][y]=dis[x][now]+1;
				q.push(make_pair(-dis[x][y],y));
			}
		}
	}
	for(int i=2;i<=n;i++){
		if(i==x)continue;
		if(dis[x][i]<=k)p[x].push(make_pair(a[i],i));
	}
}
int ans;
signed main(){
//	freopen("holiday3.in","r",stdin);
	memset(dis,0x7f,sizeof(dis));
	scanf("%lld%lld%lld",&n,&m,&k);
	k++;
	for(int i=2;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	for(int i=1;i<=m;i++){
		int x,y;
		scanf("%lld%lld",&x,&y);
		add(x,y),add(y,x);
	}
	for(int i=1;i<=n;i++){
		dij(i);
	}
	for(int i=2;i<=n;i++){
		int ta[4],tb[4],tat=3,tbt=3;
		priority_queue<pair<int,int> > tmpq;
		for(int t=1;t<=tat;t++){
			if(!p[i].size()){
				tat=t-1;
				break;
			}
			if(dis[1][p[i].top().second]>k){
				t--;
				tmpq.push(p[i].top());
				p[i].pop();
				continue;
			}
			tmpq.push(p[i].top());
			ta[t]=p[i].top().second;
			p[i].pop();
		}
		while(tmpq.size()){
			p[i].push(tmpq.top());
			tmpq.pop();
		}
		for(int j=2;j<=n;j++){
			if(i==j||dis[i][j]>k)continue;
			for(int t=1;t<=tbt;t++){
				if(!p[j].size()){
					tbt=t-1;
					break;
				}
				if(dis[1][p[j].top().second]>k){
					t--;
					tmpq.push(p[j].top());
					p[j].pop();
					continue;
				}
				tmpq.push(p[j].top());
				tb[t]=p[j].top().second;
				p[j].pop();
			}
			while(tmpq.size()){
				p[j].push(tmpq.top());
				tmpq.pop();
			}
//			cout<<
			for(int ti=1;ti<=tat;ti++){
				for(int tj=1;tj<=tbt;tj++){
					int u=ta[ti],v=tb[tj];
					if(u==v||u==i||u==j)continue;
					if(v==i||v==j)continue;
					ans=max(ans,a[i]+a[j]+a[u]+a[v]);
				}
			}
		}
	}
	printf("%lld",ans);
	return 0;
}
2022/11/17 21:52
加载中...