首页 > 代码库 > [状压dp]经典TSP
[状压dp]经典TSP
0出发 每个顶点经过一次 回到0 最小花费.
记忆化搜索:
1 // s: 已经访问过的节点状态 v: 当前位置 2 int dfs(int s, int v) 3 { 4 if(dp[s][v]>=0) 5 return dp[s][v]; 6 if(s==(1<<n)-1 && v==0) // 所有都走过 并 回到0 7 return dp[s][v]=0; 8 int ans=INF; 9 for(int u=0;u<n;u++)10 if(!(s>>(u &1))) // u没走过 则走到u11 ans=min(ans, dfs(s | (1<<u), u)+mp[v][u]);12 return dp[s][v]=ans;13 }14 int main()15 {16 memset(dp, -1, sizeof(dp));17 printf("%d\n", dfs(0, 0));18 return 0;19 }
直接dp:
1 memset(dp, 127, sizeof(dp));2 dp[(1<<n)-1][0]=0;3 for(int s=(1<<n)-2;s>=0;s--)4 for(int v=0;v<n;v++)5 for(int u=0;u<n;u++)6 if(!(s>> u & 1))7 dp[s][v]=min(dp[s][v], dp[s | 1<<u][u]+mp[v][u]);8 printf("%d", dp[0][0]);
[状压dp]经典TSP
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。