社区讨论
求调
P1294高手去散步参与者 2已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @mhjkzmea
- 此快照首次捕获于
- 2025/11/04 04:17 4 个月前
- 此快照最后确认于
- 2025/11/04 04:17 4 个月前
记忆化前0分(不过没有tle,所以是不是不用记忆化),加了更错了,两版都放了,帮忙看看是哪里少了几句吗?
前
CPP#include<bits/stdc++.h>
using namespace std;
const int N=23;
struct p{
vector<int> edge,plen;
};
p path[N];
int n,m,vis[N],ans;
void dfs(int i,int sum){//从第i个观景点开始走,已经走了sum
for(int j:path[i].edge){
if(vis[j]==0){
vis[j]=1;
dfs(j,path[i].plen[j]+sum);
vis[j]=0;
}
}
ans=max(sum,ans);
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v,len;
cin>>u>>v>>len;
path[u].edge.push_back(v);
path[v].edge.push_back(u);
path[u].plen.push_back(len);
path[v].plen.push_back(len);
}
for(int i=1;i<=n;i++){
dfs(i,0);
}
cout<<ans;
}
记忆化后
CPP#include<bits/stdc++.h>
using namespace std;
const int N=23;
struct p{
vector<int> edge,plen;
};
p path[N];
int n,m,vis[N],ans,f[N][N],cal[N][N];//f 从第i 走到第j最大路程 cal是否算过i到j vis是否经过过i
int dfs(int i,int sum){//从第i个观景点开始走,已经走了sum
for(int j:path[i].edge){
if(cal[i][j]==1 or cal[j][i]==1)
return max(f[i][j],f[j][i]);
if(vis[j]==0){
vis[j]=1;
sum+=path[i].plen[j];
f[i][j]=f[j][i]=max({f[i][j],f[j][i],dfs(j,sum)});
cal[i][j]=cal[j][i]=1;
vis[j]=0;
}
}
return sum;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v,len;
cin>>u>>v>>len;
path[u].edge.push_back(v);
path[v].edge.push_back(u);
path[u].plen.push_back(len);
path[v].plen.push_back(len);
}
for(int i=1;i<=n;i++){
ans=max(ans,dfs(i,0));
}
cout<<ans;
}
万分感谢 orz
回复
共 9 条回复,欢迎继续交流。
正在加载回复...