社区讨论
民间WA,Unaccepted 100分求调
P8817[CSP-S 2022] 假期计划参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo1hnv5n
- 此快照首次捕获于
- 2023/10/22 21:12 2 年前
- 此快照最后确认于
- 2023/11/02 21:48 2 年前
做法是自己想的,感觉和正解差不多,就是bfs求可到达点然后bitset求交集贪心处理,然后枚举b,c两个点判断
民间数据寄了几个点,但是找不到问题原因()
CPP#include<bits/stdc++.h>
using namespace std;
const int maxn=2500+10;
typedef long long ll;
int n,m,k;
ll a[maxn];
vector<int>c[maxn];
bitset<maxn>ct[maxn],cp[maxn];
int vis[maxn],dis[maxn];
void bfs(int x)
{
memset(vis,0,sizeof(vis));
memset(dis,0x3f3f3f3f,sizeof(dis));
vis[x]=1;dis[x]=0;
queue<int>q;
q.push(x);
while(!q.empty())
{
int p=q.front();
q.pop();
for(int i=0;i<c[p].size();i++)
{
if(vis[c[p][i]]==1)
continue;
vis[c[p][i]]=1;
dis[c[p][i]]=dis[p]+1;
q.push(c[p][i]);
}
}
for(int i=1;i<=n;i++)
if(dis[i]<=k&&x!=i)
ct[x][i]=1;
return;
}
pair<ll,int>dx[maxn][4];
pair<ll,int>vim[maxn];
void get3max(int x)
{
for(int i=1;i<=n;i++)
{
if(cp[x][i]==1)
vim[i].first=a[i];
else
vim[i].first=-1;
vim[i].second=i;
}
for(int i=1;i<=3;i++)
{
for(int j=n-1;j>=i;j--)
{
if(vim[j].first<vim[j+1].first)
swap(vim[j+1],vim[j]);
}
dx[x][i]=vim[i];
// cout<<dx[x][i].first<<" "<<dx[x][i].second<<endl;
}
return;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m>>k;
k+=1;
for(int i=2;i<=n;i++)
cin>>a[i];
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
c[x].push_back(y);
c[y].push_back(x);
}
for(int i=1;i<=n;i++)
bfs(i);
for(int i=1;i<=n;i++)
{
cp[i]=ct[i]&ct[1];
get3max(i);
}
ll ans=0;
for(int p=2;p<=n;p++)
{
for(int t=2;t<=n;t++)
{
if(p==t)
continue;
if(ct[p][t]==0)
continue;
for(int i=1;i<=3&&dx[p][i].first!=-1;i++)
{
for(int j=1;j<=3&&dx[t][i].first!=-1;j++)
{
if(1==p||1==t||1==dx[p][i].second||1==dx[t][j].second||p==t||p==dx[p][i].second||p==dx[t][j].second||dx[p][i].second==dx[t][j].second||t==dx[p][i].second||t==dx[t][j].second)
continue;
ans=max(ans,a[p]+a[t]+dx[p][i].first+dx[t][j].first);
}
}
}
}
cout<<ans<<endl;
return 0;
}
麻烦好心人调一下/kel/kel 给关注qwq
回复
共 0 条回复,欢迎继续交流。
正在加载回复...