俩个代码仅仅dfs中vis数组位置不同
区别只是已遍历的节点只是入队但随即又出对了
为什么不对我也不理解
前者WA#7和#22
后者AC

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2507,M = 2e4+9;
int n,m,k;
ll a[N],ans;
int h[N],ne[M],ver[M],idx;
void add(int u,int v)
{
ver[++idx] = v,ne[idx] = h[u],h[u] = idx;
}
bool ok[N][N],vis[N];
int dis[N];
vector<int>f[N];
void bfs(int x)
{
queue<int>q;
memset(vis,0,sizeof vis);
memset(dis,0,sizeof dis);
q.push(x);
while(!q.empty())
{
int u = q.front();q.pop();
if(vis[u])continue;
vis[u] = 1;
if(u != x)
{
ok[x][u] = 1;
if(ok[1][u])
{
f[x].push_back(u);
sort(f[x].begin(),f[x].end(),[](int x,int y){return a[x] > a[y];});
if(f[x].size() > 3)f[x].pop_back();
}
}
if(dis[u] < k)
{
for(int i = h[u];i;i = ne[i])
{
int v = ver[i];
dis[v] = dis[u]+1;
q.push(v);
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
k++;
for(int i = 2;i <= n;i++)scanf("%lld",a+i);
for(int i = 1;i <= m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v),add(v,u);
}
for(int i = 1;i <= n;i++)
bfs(i);
for(int i = 2;i <= n;i++)
for(int j = i+1;j <= n;j++)
if(ok[i][j])
{
for(int x:f[i])
for(int y:f[j])
if(x != y && x != j && y != i)
ans = ans<a[i]+a[j]+a[x]+a[y] ? a[i]+a[j]+a[x]+a[y] : ans;
}
printf("%lld",ans);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2507,M = 2e4+9;
int n,m,k;
ll a[N],ans;
int h[N],ne[M],ver[M],idx;
void add(int u,int v)
{
ver[++idx] = v,ne[idx] = h[u],h[u] = idx;
}
bool ok[N][N],vis[N];
int dis[N];
vector<int>f[N];
void bfs(int x)
{
queue<int>q;
memset(vis,0,sizeof vis);
memset(dis,0,sizeof dis);
q.push(x);
vis[x] = 1;
while(!q.empty())
{
int u = q.front();q.pop();
if(u != x)
{
ok[x][u] = 1;
if(ok[1][u])
{
f[x].push_back(u);
sort(f[x].begin(),f[x].end(),[](int x,int y){return a[x] > a[y];});
if(f[x].size() > 3)f[x].pop_back();
}
}
if(dis[u] < k)
{
for(int i = h[u];i;i = ne[i])
{
int v = ver[i];
if(vis[v])continue;
vis[v] = 1;
dis[v] = dis[u]+1;
q.push(v);
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
k++;
for(int i = 2;i <= n;i++)scanf("%lld",a+i);
for(int i = 1;i <= m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v),add(v,u);
}
for(int i = 1;i <= n;i++)
bfs(i);
for(int i = 2;i <= n;i++)
for(int j = i+1;j <= n;j++)
if(ok[i][j])
{
for(int x:f[i])
for(int y:f[j])
if(x != y && x != j && y != i)
ans = ans<a[i]+a[j]+a[x]+a[y] ? a[i]+a[j]+a[x]+a[y] : ans;
}
printf("%lld",ans);
return 0;
}