社区讨论
100pts WA 悬关求助
P8817[CSP-S 2022] 假期计划参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @lo21m31u
- 此快照首次捕获于
- 2023/10/23 06:31 2 年前
- 此快照最后确认于
- 2023/11/03 06:53 2 年前
rt,bfs 爆搜路径长,用set维护能到达的最大的三个点,民间数据WA声一片。
CPP#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
using namespace std;
const int N=2510,M=10010,inf=0x3f3f3f3f;
struct edge{
int to,nxt;
}e[M+M];
int head[N],cnt;
int n,m,k;
int w[N],dis[N][N];
bool vis[N][N];
set<pair<int,int>> st[N];
void add(int u,int v){
e[++cnt].to=v;
e[cnt].nxt=head[u];
head[u]=cnt;
}
void bfs(int s){
queue<int> q;
q.push(s);
dis[s][s]=0;
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=head[x];i;i=e[i].nxt){
int y=e[i].to;
if(dis[s][y]<inf) continue;
dis[s][y]=dis[s][x]+1;
q.push(y);
}
}
}
int main(){
//freopen("holiday.in","r",stdin);
scanf("%d%d%d",&n,&m,&k);
k++;
for(int i=2;i<=n;i++) scanf("%d",&w[i]);
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
memset(dis,0x3f,sizeof dis);
for(int i=1;i<=n;i++) bfs(i);
int res=0;
for(int i=2;i<=n;i++){
for(int j=2;j<=n;j++){
if(i==j||dis[i][j]>k||dis[1][j]>k) continue;
st[i].insert({w[j],j});
if(st[i].size()>3) st[i].erase(st[i].begin());
}
}
for(int b=2;b<=n;b++){
for(int c=2;c<=n;c++){
if(b==c||dis[b][c]>k) continue;
int a=0,d=0;
for(auto ta:st[b]){
for(auto td:st[c]){
a=ta.second;d=td.second;
if(a==d||a==c||b==d) continue;
res=max(res,w[a]+w[b]+w[c]+w[d]);
}
}
}
}
cout<<res;
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...