郊区春游(状压DP水题)+ 记录路径
题目链接:
https://ac.nowcoder.com/acm/problem/16122
题目大意:
中文
具体思路:
首先对全图跑一遍floyed,然后dp[i][j]表示第i个状态在j点停下来的最短距离。
AC代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define inf 0x3f3f3f3f 5 #define LL_inf (1ll << 60) 6 const int maxn = 200+55; 7 const int mod = 1e9 + 7; 8 int sto[maxn]; 9 int dp[34000][maxn]; 10 int dis[maxn][maxn]; 11 int n,m,r; 12 void floyed() 13 { 14 for(int i=1; i<=n; i++) 15 { 16 for(int j=1; j<=n; j++) 17 { 18 for(int k=1; k<= n; k++) 19 { 20 dis[j][k]=min(dis[j][k],dis[j][i]+dis[i][k]); 21 } 22 } 23 } 24 } 25 int main() 26 { 27 // cout<<(1<<15)<<endl; 28 scanf("%d %d %d",&n,&m,&r); 29 for(int i=0; i<r; i++) 30 { 31 scanf("%d",&sto[i]); 32 } 33 for(int i=1; i<=n; i++) 34 { 35 for(int j=1; j<=n; j++) 36 { 37 if(i==j) 38 dis[i][j]=0; 39 else 40 dis[i][j]=inf ; 41 } 42 } 43 int st,ed,val; 44 for(int i=1; i<=m; i++) 45 { 46 scanf("%d %d %d",&st,&ed,&val); 47 //st--,ed--; 48 dis[st][ed]=min(dis[st][ed],val); 49 dis[ed][st]=dis[st][ed]; 50 } 51 floyed(); 52 // for(int i=0;i<n;i++){ 53 // for(int j=i;j<n;j++){ 54 // cout<<i<<" "<<j<<" "<<dis[i][j]<<endl; 55 // } 56 // } 57 memset(dp,inf,sizeof (dp) ); 58 for(int i=0; i<r; i++) 59 { 60 dp[(1<<i)][i]=0 ; 61 } 62 int maxstate=(1<<r)-1; 63 for(int i=0; i<=maxstate; i++) 64 { 65 for(int j=0; j<r; j++) 66 { 67 if((i&(1<<j))==0) 68 continue; 69 for(int k=0; k<r; k++) 70 { 71 // if(i&(1<<k)) 72 // continue; 73 dp[i^(1<<k)][k]=min(dp[i^(1<<k)][k],dp[i][j]+dis[sto[j]][sto[k]]); 74 } 75 } 76 } 77 int minn=inf ; 78 for(int i=0; i<r; i++) 79 { 80 minn=min(minn,dp[maxstate][i]); 81 } 82 printf("%d\n",minn); 83 return 0; 84 }
记录路径
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define inf 0x3f3f3f3f 5 #define LL_inf (1ll << 60) 6 const int maxn = 200 + 55; 7 const int mod = 1e9 + 7; 8 int sto[maxn]; 9 int dp[34000][maxn]; 10 int dis[maxn][maxn]; 11 int n, m, r; 12 pair<int, int> pre[(1 << 16)][(20)]; 13 void floyed() { 14 for (int i = 1; i <= n; i++) { 15 for (int j = 1; j <= n; j++) { 16 for (int k = 1; k <= n; k++) { 17 dis[j][k] = min(dis[j][k], dis[j][i] + dis[i][k]); 18 } 19 } 20 } 21 } 22 int flag=1; 23 void dfs(int sta, int pos) { 24 if (sta != -1) { 25 dfs(pre[sta][pos].first, pre[sta][pos].second); 26 if(flag){ 27 flag=0; 28 } 29 else 30 cout << sto[pre[sta][pos].second] << " "; 31 } 32 } 33 int main() { 34 // cout<<(1<<15)<<endl; 35 scanf("%d %d %d", &n, &m, &r); 36 for (int i = 0; i < r; i++) { 37 scanf("%d", &sto[i]); 38 } 39 for (int i = 1; i <= n; i++) { 40 for (int j = 1; j <= n; j++) { 41 if (i == j) 42 dis[i][j] = 0; 43 else 44 dis[i][j] = inf; 45 } 46 } 47 int st, ed, val; 48 for (int i = 1; i <= m; i++) { 49 scanf("%d %d %d", &st, &ed, &val); 50 dis[st][ed] = min(dis[st][ed], val); 51 dis[ed][st] = dis[st][ed]; 52 } 53 floyed(); 54 memset(dp, inf, sizeof(dp)); 55 for (int i = 0; i < r; i++) { 56 dp[(1 << i)][i] = 0; 57 pre[i][i] = make_pair(-1, i); 58 } 59 int maxstate = (1 << r) - 1; 60 for (int i = 0; i <= maxstate; i++) { 61 for (int j = 0; j < r; j++) { 62 if ((i & (1 << j)) == 0) 63 continue; 64 for (int k = 0; k < r; k++) { 65 if (i & (1 << k)) 66 continue; 67 if (dp[i][j] + dis[sto[j]][sto[k]] < dp[i ^ (1 << k)][k]) { 68 dp[i ^ (1 << k)][k] = dp[i][j] + dis[sto[j]][sto[k]]; 69 pre[i ^ (1 << k)][k] = make_pair(i, j); 70 } 71 } 72 } 73 } 74 int sta; 75 int minn = inf; 76 for (int i = 0; i < r; i++) { 77 if (dp[maxstate][i] < minn) { 78 minn = dp[maxstate][i]; 79 sta = i; 80 } 81 } 82 dfs(maxstate, sta); 83 return 0; 84 }
转载于:https://www.cnblogs.com/letlifestop/p/11079361.html
郊区春游(状压DP水题)+ 记录路径相关推荐
- 郊区春游(状压dp)
链接:https://ac.nowcoder.com/acm/contest/134/D 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★
昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...
- 刷题周记(九)——#状压DP:最短Hamilton路径、小国王(互不侵犯)、玉米田(Corn Fields G)、愤怒的小鸟、吃奶酪、炮兵阵地、宝藏 #区间DP:清空字符串#DP:关灯问题II
文章目录 --2020年12月20日(周日)------------------ 状压DP 一.最短Hamilton路径(模板题) 二.玉米田(P1879 [USACO06NOV]Corn Field ...
- agc012E Camel and Oases(状压dp+思路题)
这题神啊.状压dp你敢信?思维难度爆表还有一堆细节要注意???orz Visjiao 原题链接:http://agc012.contest.atcoder.jp/tasks/agc012_e 大神题解 ...
- 牛客 郊区春游 状压+最短路
题目链接:郊区春游 思路:首先先用floyd求一下各个点之间的最短路,那么接下来就是找出一条最短路将R个点串起来.最简单的就是枚举每一种排列然后求最小值,那么时间复杂度就是15!,也就是1307674 ...
- P2704 炮兵阵地 (状压dp入门题) 题解
题意简述:给定一个大小为n*m的棋盘,棋盘上'H'表示不可放置,'P'表示可放置,一个棋子在棋盘上的攻击范围是其左右上下2格以内,求不冲突情况下的最多摆放棋子数. 分析:决策是对于一个P格子考虑放或不 ...
- 小国王(状压dp经典题)
#include <bits/stdc++.h> using namespace std; int n, m; const int N = 15; long long dp[N][1100 ...
- [状压dp] 蒙德里安的梦想(模板题+状压dp)
文章目录 0. 前言 1. 状压dp 模板题 0. 前言 状压 dp 就是采用二进制数保存状态,方便进行位运算操作.例如 八皇后.八数码问题也都是采用了状态压缩的思想来使用一个二进制数唯一对应集合中的 ...
- [状压dp] 最短Hamilton路径(模板题+状压dp)
文章目录 0. 前言 1. 状压dp 模板题 0. 前言 状压 dp 就是采用二进制数保存状态,方便进行位运算操作.例如 八皇后.八数码问题也都是采用了状态压缩的思想来使用一个二进制数唯一对应集合中的 ...
最新文章
- CentOS 7 网页加载速度慢的解决办法
- Design Pattern Template Method C
- 历时7周,当然了真正的安装时间没这么多,终于把集群安装好了
- 115个Java面试题和答案——终极列表(下)
- Google 代码搜索
- Django有办法打开HTTP长轮询连接吗?
- 每周到岗上班3天,2天可在家办公!携程3+2工作模式来了
- 转:基于AOP实现Ibatis的缓存配置过期策略
- 于的繁体字有几种写法_【于字书法繁体字怎么写】作文写作问答 - 归教作文网...
- 争对让望对思野葛对山栀注解_《笠翁对韵》四 支(4)
- SPSS学习笔记【一】-检验相关性
- 新团队团队融合研讨会_新的网络研讨会:如何避免持续交付的隐性成本
- 极智AI | 教你 tensorrt 实现 mish 算子
- 互联网海量视频数据的存储
- ElGamal数字签名
- 推广你的网站,从学会写软文开始
- 亚马逊上传报告报错常见情况
- javascript案例5——壁纸切换、背景换肤
- 北邮信通复试题c语言,『转贴』北邮信通院跑调剂的经历
- 主X的船长你走吧,我们能赢