考场上三个样例全过,民间数据5分
查看原帖
考场上三个样例全过,民间数据5分
314499
mibamiba楼主2022/10/29 23:13

完力(悲)

#include<bits/stdc++.h>
using namespace std;
struct nod{
	long long to,d;
};
struct cmp{
	bool operator()(nod x,nod y){
		return x.d>y.d;
	}
};
priority_queue<nod,vector<nod>,cmp>q;
priority_queue<nod,vector<nod>,cmp>sortq;
long long n,m,k,val[2510],dis[2510][2510],u,v,dp[2510][5],ans=0,pos[2510];
long long t1,t2,t3,t4,ok[2510][2510];
bool vh[2510],f[2510],soe[2510];
vector<long long>w[2510];
void dijkstra(long long st){
	memset(vh,0,sizeof(vh));
	while(!q.empty()) q.pop();
	dis[st][st]=0;
	q.push(nod{st,0});
	while(!q.empty()){
		nod now=q.top();
		q.pop();
		if(vh[now.to]) continue;
		vh[now.to]=1;
		for(long long i=0;i<w[now.to].size();++i){
			long long nt=w[now.to][i];
			if(dis[st][nt]>dis[st][now.to]+1){
				dis[st][nt]=dis[st][now.to]+1;
				q.push(nod{nt,dis[st][nt]});
			}
		}
	}
}
bool stcmp(long long as,long long bs){
	return val[as]>val[bs];
}
int main(){
	//freopen("holiday.in","r",stdin);
	//freopen("holiday.out","w",stdout);
	cin>>n>>m>>k;
	k++;
	for(long long i=1;i<n;++i){
		cin>>val[i+1];
	}
	for(long long i=1;i<=m;++i){
		cin>>u>>v;
		w[u].push_back(v);
		w[v].push_back(u);
	}
	memset(dis,127,sizeof(dis));
	for(long long i=1;i<=n;++i){
		dijkstra(i);
		//for(long long j=1;j<=n;++j) cout<<dis[i][j]<<' ';
		//cout<<endl;
	}
	for(long long i=2;i<=n;++i) if(dis[1][i]<=k) soe[i]=1;
	memset(pos,0,sizeof(pos));
	for(long long i=2;i<=n;++i){
		for(long long j=2;j<=n;++j){
			if(i==j) continue;
			if(dis[i][j]<=k&&soe[j]) ok[i][++pos[i]]=j;
		}
		//cout<<i<<':'<<endl;
		//for(long long j=1;j<=pos[i];++j) cout<<ok[i][j]<<' ';
		//cout<<endl;
	}
	for(long long i=1;i<=n;++i){
		sort(ok[i]+1,ok[i]+pos[i]+1,stcmp);
	}
	for(long long i=2;i<=n;++i){
		for(long long j=2;j<=n;++j){
			if(i==j||!pos[i]||!pos[j]) continue;
			if(ok[i][1]==j&&ok[j][1]==i){
				if(pos[i]==1||pos[j]==1);
				if(ok[i][2]==ok[j][2]){
					if(pos[i]==2&&pos[j]==2);
					else if(pos[i]==2) ans=max(ans,val[i]+val[j]+val[ok[j][3]]+val[ok[i][2]]);
					else if(pos[j]==2) ans=max(ans,val[i]+val[j]+val[ok[i][3]]+val[ok[j][2]]);
					else ans=max(ans,max(val[i]+val[j]+val[ok[j][3]]+val[ok[i][2]],val[i]+val[j]+val[ok[i][3]]+val[ok[j][2]]));
				}
				else ans=max(ans,val[i]+val[j]+val[ok[i][2]]+val[ok[j][2]]);
			}
			else if(ok[j][1]==i){
				if(pos[j]==1);
				else ans=max(ans,val[i]+val[j]+val[ok[i][1]]+val[ok[j][2]]);
			}
			else if(ok[i][1]==j){
				if(pos[i]==1);
				else ans=max(ans,val[i]+val[j]+val[ok[j][1]]+val[ok[i][2]]);
			}
			else if(ok[i][1]==ok[j][1]){
				if(pos[i]==1&&pos[j]==1);
				else if(pos[i]==1){
					if(ok[j][2]==i){
						if(pos[j]==2);
						else ans=max(ans,val[i]+val[j]+val[ok[i][1]]+val[ok[j][3]]);
					}
					else ans=max(ans,val[i]+val[j]+val[ok[i][1]]+val[ok[j][2]]);
				}
				else if(pos[j]==1){
					if(ok[i][2]==j){
						if(pos[i]==2);
						else ans=max(ans,val[i]+val[j]+val[ok[j][1]]+val[ok[i][3]]);
					}
					else ans=max(ans,val[i]+val[j]+val[ok[j][1]]+val[ok[i][2]]);
				}
				else{
					long long ansi,ansj;
					if(ok[i][2]==j){
						if(pos[i]==2) ansi=0;
						else ansi=val[i]+val[j]+val[ok[i][3]]+val[ok[j][1]];
					}
					else ansi=val[i]+val[j]+val[ok[i][2]]+val[ok[j][1]];
					if(ok[j][2]==i){
						if(pos[j]==2) ansj=0;
						else ansj=val[i]+val[j]+val[ok[j][3]]+val[ok[i][1]];
					}
					else ansj=val[i]+val[j]+val[ok[j][2]]+val[ok[i][1]];
					ans=max(ans,max(ansi,ansj));
				}
			}
			else ans=max(ans,val[i]+val[j]+val[ok[i][1]]+val[ok[j][1]]);
			//cout<<i<<' '<<j<<' '<<ans<<endl;
		}
	}
	cout<<ans<<endl;
	return 0;
}

希望ccf数据大水(

2022/10/29 23:13
加载中...