社区讨论
见了鬼了(求条)
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 条回复,欢迎继续交流。
正在加载回复...