社区讨论

见了鬼了(求条)

P8817[CSP-S 2022] 假期计划参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhjdhqtk
此快照首次捕获于
2025/11/04 00:47
4 个月前
此快照最后确认于
2025/11/04 00:47
4 个月前
查看原帖
调那么久说我得了80分,扣掉的20分还没有共同特征:
#6 #7 #12 #13(CCF原数据)
希望有牛犇帮一下忙
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int score[2502];
vector<int>a[2502];
int n,m,k;
int dis[2502][2502];
bool vis[2502][2502];
bool vis1[2502];
int dfs(int x,int cnt,int sc){
	//cout<<x<<" ";
	sc+=score[x];
	if(cnt==4*(k+1))return sc;
	vis1[x]=1;
	int maxx=0;
	for(auto i:a[x]){
		if(vis1[i])continue;
		if(cnt==3){
			if(dis[i][1]==k+1){
				maxx=max(maxx,dfs(i,cnt+1,sc));
			}
			vis1[i]=0;
		}else{
			maxx=max(maxx,dfs(i,cnt+1,sc));
			vis1[i]=0;
			//maxx=max(maxx,dfs(i,cnt,sc-score[i]));
			//vis1[i]=0;
		}
	}
	return maxx;
}/*
int crst[2502];
int whost[2502];
int cred[2502];
int whoed[2502];
int crrd[2502];
int whord[2502];
bool vis2[2502];
vector<int>ch;
unordered_map<int,bool>mp;
struct giving{
	int gvst,gved,gvrd;
	int gvwst,gvwed,gvwrd;
};
void init(int x,int step,giving g){
	giving wg=g;
	vis2[x]=1;
	crst[x]=g.gvst;
	whost[x]=g.gvwst;
	cred[x]=g.gved;
	whoed[x]=g.gvwed;
	crrd[x]=g.gvrd;
	whord[x]=g.gvwrd;
	if(step>2*(k+1))return ;
	if(step<=k+1){
		if(score[x]>g.gvst){
			wg.gvst=score[x];
		}else if(score[x]>g.gved){
			wg.gved=score[x];
		}else if(score[x]>g.gvrd){
			wg.gvrd=score[x];
		}
	}
	
	if(!mp.count(x)){
		mp[x]=1;
		ch.push_back(x);
	}
	for(auto i:a[x]){
		if(!vis2[i]){
			init(i,step+1,wg);
			vis2[i]=0;
		}
	}
}
bool cmp(int a,int b){
	return dis[1][a]<dis[1][b];
}*/
struct Node{
	vector<pair<int,int> >num;
};
bool cmp(pair<int,int>A,pair<int,int>b){
	return A.first>b.first;
}
vector<pair<int,int> >b[2502];
void init(int x){
    vector<pair<int,int> >l;
    for(int i=2;i<=n;i++){
        if(i==x)continue;
        if(dis[i][x]<=k+1&&dis[i][1]<=k+1){
            l.push_back({score[i],i});
            sort(l.begin(),l.end(),cmp);
            while(l.size()>3){
                l.pop_back();
            }
        }
    }
    b[x]=l;
}
/*
void init(int x,int step,Node y){
    if(dis[1][x]>2*(k+1))return ;
	vis1[x]=1;
	for(int i=0;i<y.num.size();i++){
		b[x][i]=y.num[i];
	}
	if(dis[x][1]<=k+1){
		if(score[x]!=0)
		y.num.push_back({score[x],x});
		sort(y.num.begin(),y.num.end(),cmp);
		while(y.num.size()>3){
			y.num.pop_back();
		}
	}
	for(auto i:a[x]){
		if(!vis1[i]){
			init(i,step+1,y);
			vis1[i]=0;
		}
	}
}*/
signed main(){
	cin>>n>>m>>k;
	for(int i=2;i<=n;i++){
		cin>>score[i];
	}
	for(int i=0;i<m;i++){
		int x,y;
		cin>>x>>y;
		a[x].push_back(y);
		a[y].push_back(x);
	}
	
	for(int i=1;i<=n;i++){
		queue<pair<int,int> >q;
		q.push({i,0});
		vis[i][i]=1;
		while(!q.empty()){
			int x=q.front().first,sc=q.front().second;
			//sc=dis;
			q.pop();
			dis[i][x]=sc;
			for(auto j:a[x]){
				if(!vis[i][j]){
					vis[i][j]=1;
					q.push({j,sc+1});
				}
			}
		}
	}
	if(k==0){
		cout<<dfs(1,0,0);
		return 0;
	}
	
	//Node fw;
	//init(1,0,fw);
    for(int i=1;i<=n;i++)
        init(i);
	int ans=0;
	for(int i=2;i<=n;i++){
		for(int j=2;j<=n;j++){
            if(i==j||dis[i][j]>k+1)continue;
			int maxx=0;
            bool f=0;
			for(int A=0;A<b[i].size();A++){
				for(int B=0;B<b[j].size();B++){
					if(b[i][A].second!=b[j][B].second&&
                      b[i][A].second!=j&&b[j][B].second!=i
                      &&b[i][A].second!=i&&b[j][B].second!=j){f=1;
						maxx=max(maxx,b[i][A].first+b[j][B].first);
					}
				}
			}
            if(maxx+score[i]+score[j]>ans){;
                //cout<<i<<" "<<j<<" "<<maxx<<endl;
            }
            if(f)
			ans=max(ans,maxx+score[i]+score[j]);
		}
	}
	cout<<ans;
	/*
	init(1,0,(giving){0,0,0,0,0,0});
	int ans=-1;
	for(int i=0;i<ch.size();i++){
		for(int j=i+1;j<ch.size();j++){
			if(dis[i][j]<=k+1){
				int maxx=-1;
				if(whost[i]!=whost[j]){
					maxx=max(maxx,crst[i]+crst[j]);
				}else if(whost[i]!=whoed[j]){
					maxx=max(maxx,crst[i]+cred[j]);
				}else if(whost[i]!=whord[j]){
					maxx=max(maxx,crst[i]+crrd[j]);
				}else if(whoed[i]!=whost[j]){
					maxx=max(maxx,cred[i]+crst[j]);
				}else if(whoed[i]!=whoed[j]){
					maxx=max(maxx,cred[i]+cred[j]);
				}else if(whoed[i]!=whord[j]){
					maxx=max(maxx,cred[i]+crrd[j]);
				}else if(whord[i]!=whost[j]){
					maxx=max(maxx,crrd[i]+crst[j]);
				}else if(whord[i]!=whoed[j]){
					maxx=max(maxx,crrd[i]+cred[j]);
				}else if(whord[i]!=whord[j]){
					maxx=max(maxx,crrd[i]+crrd[j]);
				}
				ans=max(ans,maxx+score[i]+score[j]);
			}
		}
	}
	cout<<ans;
	*/
}

回复

1 条回复,欢迎继续交流。

正在加载回复...