博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 3001 Travelling
阅读量:4286 次
发布时间:2019-05-27

本文共 1607 字,大约阅读时间需要 5 分钟。

     

题意:小明想去n个城市游玩,m条路,从一个城市到达另一个城市有一定的花费,每个城市最多可以走两次

求最少的花费

题解:因为每个城市最多走两次,可以用三进制,保存状态,感觉同二进制没区别,不过想了半天没想通,

看了一下题解,懂了。

#include
#include
#include
#include
using namespace std;#define M 60000#define INF 0x3f3f3f3fint s[12];int t[M][12],map[12][12];int n,m;int dp[M][12];void init(){ s[0] = 1; for(int i = 1;i <= 11;i++){ s[i] = s[i-1] * 3 ; } for(int i = 0;i < 59049;i++){ int tmp = i; for(int j = 0;j < 10;j++){ t[i][j] = tmp % 3; tmp /= 3; } }}int main(){ init(); int u,v,w; while(cin >> n >> m){ memset(map,INF,sizeof(map)); for(int i = 0;i < m;i++){ cin >> u >> v >> w ; u -- ; v --; map[u][v] = map[v][u] = min(map[u][v],w); } memset(dp,INF,sizeof(dp)); for(int i = 0;i < n;i++) dp[s[i]][i] = 0; //初始化第i个状态只有1个城市花费为0 int ans = INF; for(int i = 0;i < s[n];i++){ bool flag = true ;//如果城市都被走过 for(int j = 0;j < n;j++){ if(!t[i][j]) flag = false; if(dp[i][j] != INF){ for(int k = 0;k < n;k++){ if(k == j || t[i][k] == 2 || map[j][k] == INF) continue; dp[i+s[k]][k] = min(dp[i+s[k]][k],dp[i][j] + map[j][k]); } } } if(flag) { for(int l = 0;l < n;l++){ ans = min(ans,dp[i][l]); } } } if(ans == INF) cout << "-1" << endl; else cout << ans << endl; }}

转载地址:http://qdsgi.baihongyu.com/

你可能感兴趣的文章
python中使用shuffle和permutation对列表进行随机洗牌区别
查看>>
使用js连接mqtt
查看>>
ubuntu下mysql数据库docker的定时备份脚本
查看>>
python3基于 Doc2Vec 的电影评论分析实战
查看>>
Centos 7 下influxdb docker的安装及使用
查看>>
python中lambda表达式使用实战
查看>>
centos 7中firewalld防火墙命令的使用
查看>>
python实现协程的三种方式
查看>>
WARNING: IPV4 forwarding is disabled. Networking will not work. 运行centos docker的时候报错
查看>>
在centos docker中封装flask应用,并使用命令和dockerfile两种方式制作镜像实战
查看>>
GARCH(二)
查看>>
Android中自带的list布局
查看>>
Adapter之大数据滑动效率优化和分页加载数据
查看>>
SQL读取大量数据的字符
查看>>
Android界面View及ViewGroup
查看>>
使用java实现高中数学中自由组合
查看>>
Java中密码加密之PBE算法
查看>>
0基础配置Android Studio
查看>>
Exception in thread "http-bio-8080-exec-7"内存溢出问题
查看>>
关于组织机构算法A001、A0010001、A0010002
查看>>