社区讨论

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 O(n2)O(n^2)爆搜路径长,用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 条回复,欢迎继续交流。

正在加载回复...