社区讨论

求调

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 条回复,欢迎继续交流。

正在加载回复...