WA 一个点,TLE 一个点
查看原帖
WA 一个点,TLE 一个点
482610
Mortidesperatslav楼主2023/12/13 20:19
#include<bits/stdc++.h>
using namespace std;
int h[100001],nxt[500001],val[500001],zd[500001],cnt=0;
int n,m,s,k;
long long dis[100001];
bool inq[100001];
int q[1000001],f,e;
long long pval[100001],pval2[100005],ans=0;
int vis[5]={};
bool ed[10001][10001];
int zhuan[10001][10001];
vector<int>ljb[10001];
void addedge(int a,int b,int c){
	cnt++;
	val[cnt]=c,zd[cnt]=b,nxt[cnt]=0;
	nxt[cnt]=h[a];
	h[a]=cnt;
}
void dfs(int i,int dep,long long valu,int vis[5]){
	register int summmm=0;
	for(register int qwq=1;qwq<=4-dep;qwq++)summmm+=pval2[qwq];
	if(summmm+valu<ans)return;
	for(register int qaq=0;qaq<4;qaq++)if(i==vis[qaq])return;
	vis[dep]=i;
	if(dep==4){
		for(register int p=0;p<ljb[i].size();p++)
			if(ljb[i][p]==1){
				ans=max(ans,valu);
			}
		return;
	}
	for(register int p=0;p<ljb[i].size();p++){
		dfs(ljb[i][p],dep+1,valu+pval[ljb[i][p]],vis);
	}
}
bool cmp(int a,int b){
	return a>b;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	memset(zhuan,-1,sizeof(zhuan));
	cin>>n>>m>>k;
	for(register int i=2;i<=n;i++){
		cin>>pval[i];
		pval2[i]=pval[i];
	}
	for(register int i=1;i<=m;i++){
		register int a,b;
		cin>>a>>b;
		addedge(a,b,1);
		addedge(b,a,1);
		ed[a][b]=1;
		ed[b][a]=1;
		zhuan[a][b]=0;
		zhuan[b][a]=0;
	}
	if(k==0&&n<=20){
		unsigned long long res=0;
						for(register int a=2;a<=n;a++){
							for(register int b=2;b<=n;b++){
								if(b==a)continue;
								for(register int c=2;c<=n;c++){
									if(c==a||c==b)continue;
									for(register int d=2;d<=n;d++){
										if(d==a||d==b||d==c)continue;
										if(ed[1][a]==1){
											if(ed[a][b]==1){
												if(ed[b][c]==1){
													if(ed[c][d]==1){
														if(ed[d][1]==1){
															if(pval[a]+pval[b]+pval[c]+pval[d]>res)res=pval[a]+pval[b]+pval[c]+pval[d];
														}
													}
												}
											}
										}
									}
								}
							}
						}
				cout<<res;
	}else if(n>20){
	for(register int s=1;s<=n;s++){
		memset(dis,-1,sizeof(dis));
		memset(inq,0,sizeof(inq));
		dis[s]=0,inq[s]=1;
		q[1]=s,f=1,e=1;
		while(f<=e){
			register int u=q[f++];
			for(register int p=h[u];p;p=nxt[p]){
				register long long v=zd[p],c=val[p];
				if(dis[v]==-1||dis[v]>dis[u]+c){
					dis[v]=dis[u]+c;
					if(inq[v]==0)q[++e]=v,inq[v]=1;
				}
			}
		}
		for(register int i=1;i<=n;i++){
			if(i==s||dis[i]>k+1||dis[i]==-1)continue;
			ljb[s].push_back(i);
		}
	}
	sort(pval2+1,pval2+n+1,cmp);
	dfs(1,0,0,vis);
	cout<<ans;
	}else{
		for(register int a=1;a<=n;a++){
							for(register int b=1;b<=n;b++){
								if(b==a)continue;
								for(register int c=1;c<=n;c++){
									if(c==a||c==b)continue;
									if(ed[a][b]&&ed[b][c]){
										ed[a][c]=1;
										if(zhuan[a][c]==-1||zhuan[a][b]+zhuan[b][c]+1<zhuan[a][c])zhuan[a][c]=zhuan[a][b]+zhuan[b][c]+1;
									}
								}
							}
						}
						unsigned long long res=0;
						for(register int a=2;a<=n;a++){
							for(register int b=2;b<=n;b++){
								if(b==a)continue;
								for(register int c=2;c<=n;c++){
									if(c==a||c==b)continue;
									for(register int d=2;d<=n;d++){
										if(d==a||d==b||d==c)continue;
										if(ed[1][a]==1){
											if(ed[a][b]==1){
												if(ed[b][c]==1){
													if(ed[c][d]==1){
														if(ed[d][1]==1){
															if(zhuan[1][a]>k||zhuan[a][b]>k||zhuan[b][c]>k||zhuan[c][d]>k||zhuan[d][1]>k)continue;
															if(pval[a]+pval[b]+pval[c]+pval[d]>res){
																res=pval[a]+pval[b]+pval[c]+pval[d];
																//cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<res<<"\n";
															}
														}
													}
												}
											}
										}
									}
								}
							}
						}
						cout<<res;
	}
}

虽然是暴力,但是感觉有过官方数据的可能?

2023/12/13 20:19
加载中...