请教一下O(n4)的代码,,15分(相当于只过了k为0的点())。 感谢ovo
#include<bits/stdc++.h>
using namespace std;
const int maxn=3000;
int n,m,k,ans;
int a[maxn],f[maxn][maxn];
void dfs(int s,int step){
bool vis[maxn]={false};
vis[s]=true;
int head=s;
int tail=n;
if(step>=k) return;//转站次数到k就退出dfs
for(int t=head;t<=n;t++){
int l=t+1;
while(l<=n){
tail=l;
if(f[head][t]==1 && f[t][tail]==1 && vis[tail]==false){//看能不能转站
vis[tail]=true;
f[head][tail]=1;
l++;
head=tail;
t=head;
dfs(head,step+1);//下一轮
}
else l++;
}
}
}
int main(){
cin>>n>>m>>k;
for(int i=2;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
f[u][v]=1;
f[v][u]=1;
}
for(int o=1;o<=n;o++) dfs(o,0);//搜
for(int u=2;u<=n;u++)
if(f[1][u]==1)
for(int v=2;v<=n;v++)
if(v!=u && f[u][v]==1)
for(int w=2;w<=n;w++)
if(w!=v && w!=u && f[v][w]==1)
for(int r=2;r<=n;r++)
if(w!=r && u!=r && v!=r && f[w][r]==1)
ans=max(ans,a[u]+a[v]+a[w]+a[r]);//找最优
cout<<ans;
return 0;
}