求教(())
查看原帖
求教(())
384450
XXXXXXXXXXXerxes楼主2022/11/17 18:50

请教一下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;		
}
2022/11/17 18:50
加载中...