URAL 1806 Mobile Telegraphs
URAL_1806
这个题目思路比较明显,将边的关系找出来之后做最短路即可,但是由于N巨大,直接判断两个字符串能否转化是划不来的。
于是不妨将所有字符串放到哈希表中,然后对于当前字符串,枚举这个字符串改变一位、交换两位的情况,然后看能否在哈希表中找到变化之后的字符串,这样对于每个字符串至多枚举200种情况,复杂度还是可以接受的。
#include<stdio.h> #include<string.h> #define MAXD 50010 #define HASH 1000003 #define INF 0x3f3f3f3f int N, D, cost[15], head[HASH], next[MAXD]; char b[MAXD][15], code[15]; int dis[MAXD], pre[MAXD], tree[4 * MAXD]; int hash(char *str) {int i, h = 0, seed = 131;while(*str)h = h * seed + *(str ++);return (h & 0x7fffffff) % HASH; } void Insert(int s) {int h = hash(b[s]);next[s] = head[h];head[h] = s; } int search(char *str) {int i, h = hash(str);for(i = head[h]; i != -1; i = next[i])if(strcmp(b[i], str) == 0)break;return i; } void init() {int i;for(i = 0; i < 10; i ++)scanf("%d", &cost[i]);memset(head, -1, sizeof(head));for(i = 1; i <= N; i ++){scanf("%s", b[i]);Insert(i); } } void update(int i) {for(; i ^ 1; i >>= 1)tree[i >> 1] = dis[tree[i]] < dis[tree[i ^ 1]] ? tree[i] : tree[i ^ 1]; } void Swap(char &x, char &y) {char t;t = x, x = y, y = t; } void dfs(int cur, int n) {if(cur == 1){printf("%d\n%d", n, cur);return ;}dfs(pre[cur], n + 1);printf(" %d", cur); } void solve() {int i, j, x, y;for(D = 1; D < N + 2; D <<= 1);memset(tree, 0, sizeof(tree));memset(dis, 0x3f, sizeof(dis));dis[1] = 0, pre[1] = 0, tree[D + 1] = 1, update(D + 1);while(x = tree[1]){strcpy(code, b[x]);tree[D + x] = 0, update(D + x);for(i = 0; i < 10; i ++)for(j = '0'; j <= '9'; j ++)if(j != code[i]){code[i] = j;y = search(code);if(y != -1 && dis[x] + cost[i] < dis[y])dis[y] = dis[x] + cost[i], pre[y] = x, tree[D + y] = y, update(D + y);code[i] = b[x][i];}for(i = 0; i < 10; i ++)for(j = i + 1; j < 10; j ++)if(code[i] != code[j]){Swap(code[i], code[j]);y = search(code);if(y != -1 && dis[x] + cost[i] < dis[y])dis[y] = dis[x] + cost[i], pre[y] = x, tree[D + y] = y, update(D + y);Swap(code[i], code[j]); }}if(dis[N] == INF)printf("-1\n"); else{printf("%d\n", dis[N]);dfs(N, 1);printf("\n");} } int main() {while(scanf("%d", &N) == 1){init();solve(); }return 0; }
URAL 1806 Mobile Telegraphs相关推荐
- 面向Mobile device的CNN模型手工设计与NAS分析总结,MobileNet V1,V2,V3,Efficient,MNasNet以及Efficient network design
手工方法和NAS的高效网络模型设计总结与分析 这篇文章主要关注对于移动端,资源受限平台的高效神经网络设计(Manually)和搜索(NAS). 高效的CNN设计不只是用在服务器,云端,资源 ...
- Paper4:Voxel-Based Extraction and Classification of 3-D Pole-Like Object From Mobile LIDAR Point Clo
Voxel-Based Extraction and Classification of 3-D Pole-Like Object From Mobile LIDAR Point Cloud Data ...
- 微信同步通讯录服务器繁忙,企业微信同步通讯录时提示 mobile existed
本帖最后由 dr琅琊人 于 2020-3-26 10:47 编辑 http://XXXX.com"},"process":"/SA/weixin/process ...
- Windows Mobile 6.0 SDK和中文模拟器下载
[转] Windows Mobile 6.0 SDK和中文模拟器下载 Windows Mobile 6.5 模拟器 2010年12月06日 星期一 07:48 转载自 zhangyanle86 终于编 ...
- Ring Tone Manager on Windows Mobile
2019独角兽企业重金招聘Python工程师标准>>> 手机铃声经常能够体现一个人的个性,有些哥们儿在自习室不把手机设置成震动,一来电就@#$^%^@&^%#$&$* ...
- windows mobile做一个摄象头预览程序
zdirectshow的原理大概大家都知道,基本就是用微软封装的接口来实现硬件无关性,但是最终调用的接口都要在驱动层有对应的实现: 为了更清楚地演示directshow的数据传输过程,我必须说明的这个 ...
- jQuery Mobile的学习时间bottonbutton的事件学习
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/xmt1139057136/article/details/27700521 程序猿都非常懒,你懂的! ...
- jQuery UI vs Kendo UI jQuery Mobile vs Kendo UI Mobile
jQuery UI vs Kendo UI http://jqueryuivskendoui.com/#introduction jQuery Mobile vs Kendo UI Mobile ht ...
- 最近最近在微软的Mobile Soft factory
最近公司在做PDA项目的开发, 我主要负责Mobile的框架设计和开发.以前都是在做winform程序,对Mobile 的开发 知之甚少,现在突然开始 做mobile的项目,压力有点大! 不知该从何处 ...
最新文章
- 赠书:响应式编程到底是什么?
- 这个德国山寨工厂靠抄袭干到240亿,让硅谷恨之入骨
- struct类型重定义 不同的基类型_汇总贴:STEP7的复杂数据类型有哪些?
- TCP/IP TIME_WAIT状态原理
- iOS核心动画之CALayer(1)
- FireFox与IE的兼容
- CSS浏览器兼容性问题
- keil5图标变成白色_电脑桌面图标全部变成白色的解决办法
- 年龄大了学Java是爱好还是转型?
- aspen怎么做灵敏度分析_不会敲代码怎么做智能分析?用奥威商业智能BI
- 4_less中带参数混合
- pathinfo函数获取非UTF-8字符集文件名的问题
- bzoj 3027: [Ceoi2004]Sweet(母函数+组合数)
- 【原创手写笔记】面试准备,关于Adaboost GBDT算法你需要知道的那些
- Atitit 2017年的技术趋势与未来的大技术趋势
- 工作中常用Linux命令总结一
- Java 13 明天发布,最新最全新特性解读
- JS逆向之国家企业信用信息公示系统Cookie传递
- Java常用术语解释
- freeCAD学习笔记二:复制与放置多个相似的实体
热门文章
- 用MobaXterm远程连接Centos系统_使用技巧---Linux工作笔记047
- ES6新特性_ES6生成器函数实例_第二个实例---JavaScript_ECMAScript_ES6-ES11新特性工作笔记023
- 深度学习001---勾股定理
- Web前端工作笔记002---json数据查询的方法_json查询大全,JsonSQL数据查询,jfunk数据查询
- resnet18 结构
- WaitForMultipleObjects函数有效值分析
- 东芝M300系列笔记本拆解图片教程 (跟自己电脑很像)
- c++ assert() 使用方法
- android播放器实现自动播放,Android实现自动播放图片功能
- android指南针校准 代码_Android 指南针传感器