首先我知道你想骂我但你先别急因为我真的太弱了我才刚接触近些年S组的题
我一开始想试试dfs然后就打了一个特别暴力的()
调了2个小时憋不出来了,应该代码上有漏洞还有需要剪枝
提交记录:this
代码:
#include <bits/stdc++.h>
using namespace std;
vector<int> u[10040];
bool vis[10040] = {};
int n, m, a, b, k,sc[3005],ans=0;
int result(int sum,int* ans) {
return max(sum,*ans);
}
void bfs_or_dfs(int depth,int cnt,int kcnt,int sum) {//depth当前遍历到得点,cnt去过的景点次数,kcnt转车次数,sum目前点数总和
if (cnt > 4)return;
/*if (depth == 1 && vis[1] == true && cnt == 4) {
ans=result(sum, &ans);
cout << sum << endl << endl;
return;
}*/
for (int i = 0; i < u[depth].size(); i++) {
int te = u[depth][i];
if (!vis[te]) {//当前到了新景点
vis[te] = true;
//cout << "for1: " << te <<" " <<cnt<< " "<<kcnt<<" "<<sum <<" "<<sc[te] << endl;
if(cnt<=4)bfs_or_dfs(te, cnt+1,0, sum + sc[te]);
if (kcnt < k) {//当前走过的点当转车
//cout << "for2: " << te << " " << cnt << " " << kcnt << " " << sum << endl;
//vis[te] = true;
bfs_or_dfs(te, cnt, kcnt + 1, sum);
//vis[te] = false;
}
vis[te] = false;
}
else if (vis[te]&&kcnt<k) {//当前点当转车
//cout << "for3: " << te << " " << cnt << " " << kcnt << " " << sum << endl;
//vis[te] = true;
bfs_or_dfs(te,cnt,kcnt+1,sum);
//vis[te] = false;
}else if (te == 1 && vis[1] == true && cnt == 4 && kcnt<=k) {
ans = result(sum, &ans);
//cout << sum << endl << endl;
return;
}
}
}
int main() {
scanf_s("%d %d %d",&n,&m,&k);
for (int i = 2; i <= n; i++)scanf_s("%d",sc+i);
for (int i = 0; i < m; i++) {
scanf_s("%d %d", &a, &b);
u[a].push_back(b);
u[b].push_back(a);
}//cout << vis[1] << endl << endl;
vis[1] = true;
bfs_or_dfs(1,0,0,0);
printf("%d\n",ans);
return 0;
}
求大佬帮忙调,万分感激.