社区讨论

100pts求调!!!!!!

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mhjt77mf
此快照首次捕获于
2025/11/04 08:06
4 个月前
此快照最后确认于
2025/11/04 08:06
4 个月前
查看原帖
WA#4
CPP
#include <bits/stdc++.h>
using namespace std;
vector<int> e[2505];
int dis1[2505];
long long dis[5][2505];
int n,m,k;
long long w[2505];
bool vis[2505];
inline long long read() {
    long long x = 0;
    bool flag = true;
    char ch = getchar();
    while (!isdigit(ch)) {
        if (ch == '-')
            flag = false;
        ch = getchar();
    }
    while (isdigit(ch)) {
        x = (x << 1) + (x << 3) + ch - '0';
        ch = getchar();
    }
    if(flag)
        return x;
    return ~(x - 1);
}
inline void write(long long x){
    if (x<10){
        putchar(x+'0');
        return ;
    }
    write(x/10);
    putchar(x%10+'0');
}
void spfa(int v0){
	memset(vis,0,sizeof(vis));
	memset(dis1,0x3f3f3f3f,sizeof(dis1));
	dis1[v0]=0;
	queue<int> q;
	q.push(v0);
	vis[v0]=1;
	while (!q.empty()){
		int h=q.front();
		q.pop();
		vis[h]=0;
		for (int i=0;i<e[h].size();i++){
			int y=e[h][i];
			if (dis1[h]+1<dis1[y]){
				dis1[y]=dis1[h]+1;
				if (!vis[y]){
					q.push(y);
					vis[y]=1;
				}
			}
		}
	}
}
bool v[2505][2505];
void dfs(int t,int v0){
	if (t==4){
		return ;
	}
	vis[v0]=1;
	for (int i=0;i<e[v0].size();i++){
		int j=e[v0][i];
		if (dis[t][v0]+w[j]>dis[t+1][j] && !vis[j]){
    		dis[t+1][j]=dis[t][v0]+w[j];
    		dfs(t+1,j);
		}
	}
	vis[v0]=0;
}
int main(){
	n=read();
    m=read();
    k=read();
	for (int i=2;i<=n;i++){
		w[i]=read();
	}
	for (int i=1;i<=m;i++){
		int x,y;
		x=read();
        y=read();
		e[y].push_back(x);
        e[x].push_back(y);
	}
	for (int i=1;i<=n;i++){
		spfa(i);
		for (int j=i+1;j<=n;j++){
			if (dis1[j]-1<=k){
				v[i][j]=1;
                v[j][i]=1;
			}
		}
	}
	for (int i=1;i<=n;i++){
        e[i].clear();
    }
	for (int i=1;i<=n-1;i++){
		for (int j=i+1;j<=n;j++){
			if (v[i][j]){
				e[j].push_back(i);
                e[i].push_back(j);
			}
		}
	}
	memset(dis,0,sizeof(dis));
	memset(vis,0,sizeof(vis));
	dfs(0,1);
	long long maxx=0;
	for (int i=2;i<=n;i++){
		if (v[i][1]){
			maxx=max(maxx,dis[4][i]);
		}
	}
    write(maxx);
	return 0;
}

回复

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

正在加载回复...