题目如上。
分析:这道题就是要给定一个 n≤2500,m≤10000的无向图,最大的路径为1->A->B->c->D->1 要满足1.A,B,C,D均不为一,且互不相同 2.每一段路径上经过的点的数量≤k;
要满足1.A,B,C,D均不为一,且互不相同 2.每一段路径上经过的点的数量≤k;
思路:可以枚举B,C,这样的办法容易想到,所以如果我们在考场上想到这就容易了,A可以一步走到1,也可以一步走到B,同理可得,D也可以一步走到1,也能一步走到C, 注意:对于满足边权全为 1 的图,单源最短路可以做到 (采用 bfs); 对于满足边权只有 0,1 两种的图,单源最短路也可以做到。(也要采用bfs) 所以我们用bfs来预处理一下,代码如下:
#include<iostream>
#include<bits/stdc++.h>
#include<vector>
using namespace std;
const int N=2505,M=10005;
int n,m,k;
long long w[N],ans;
vector<int> g[N];
int st[N][N],f[N][5];
struct node
{
int num,step;
};
bool cmp(int a,int b)
{
return w[a]>w[b];
}
void bfs(int x)
{
queue<node>q;
q.push({x,0});
while(q.size())
{
node h=q.front();
q.pop();
if(h.step==k+1) continue;
for(auto i:g[h.num])
{
if(st[x][i]>h.step+1&&i!=x)
{
st[x][i]=h.step+1;
q.push({i,h.step+1});
if(st[1][i]<=k+1)
{
f[x][3]=i;
sort(f[x]+1,f[x]+5,cmp);
}
}
}
}
}
int main()
{
int i,j;
cin>>n>>m>>k;
for(i=2;i<=n;i++) cin>>w[i];
for(i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
memset(st,0x3f,sizeof(st));
for(i=1;i<=n;i++)
{
bfs(i);
}
ans=0;
int a,b,c,d;
for(b=2;b<=n;b++)
{
for(c=2;c<=n;c++)
{
if(st[b][c]<=k+1)
{
for(i=1;i<=3;i++)
{
for(j=1;j<=3;j++)
{
a=f[b][i];
d=f[c][j];
if(a&&d&&a!=d&&a!=c&&b!=d)
ans=max(ans,w[a]+w[b]+w[c]+w[d]);
}
}
}
}
}
cout<<ans;
return 0;
}
万事俱备只欠AC