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相关推荐

  1. 面向Mobile device的CNN模型手工设计与NAS分析总结,MobileNet V1,V2,V3,Efficient,MNasNet以及Efficient network design

    手工方法和NAS的高效网络模型设计总结与分析 这篇文章主要关注对于移动端,资源受限平台的高效神经网络设计(Manually)和搜索(NAS). ​​​​​​高效的CNN设计不只是用在服务器,云端,资源 ...

  2. 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 ...

  3. 微信同步通讯录服务器繁忙,企业微信同步通讯录时提示 mobile existed

    本帖最后由 dr琅琊人 于 2020-3-26 10:47 编辑 http://XXXX.com"},"process":"/SA/weixin/process ...

  4. Windows Mobile 6.0 SDK和中文模拟器下载

    [转] Windows Mobile 6.0 SDK和中文模拟器下载 Windows Mobile 6.5 模拟器 2010年12月06日 星期一 07:48 转载自 zhangyanle86 终于编 ...

  5. Ring Tone Manager on Windows Mobile

    2019独角兽企业重金招聘Python工程师标准>>> 手机铃声经常能够体现一个人的个性,有些哥们儿在自习室不把手机设置成震动,一来电就@#$^%^@&^%#$&$* ...

  6. windows mobile做一个摄象头预览程序

    zdirectshow的原理大概大家都知道,基本就是用微软封装的接口来实现硬件无关性,但是最终调用的接口都要在驱动层有对应的实现: 为了更清楚地演示directshow的数据传输过程,我必须说明的这个 ...

  7. jQuery Mobile的学习时间bottonbutton的事件学习

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/xmt1139057136/article/details/27700521 程序猿都非常懒,你懂的! ...

  8. 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 ...

  9. 最近最近在微软的Mobile Soft factory

    最近公司在做PDA项目的开发, 我主要负责Mobile的框架设计和开发.以前都是在做winform程序,对Mobile 的开发 知之甚少,现在突然开始 做mobile的项目,压力有点大! 不知该从何处 ...

最新文章

  1. 赠书:响应式编程到底是什么?
  2. 这个德国山寨工厂靠抄袭干到240亿,让硅谷恨之入骨
  3. struct类型重定义 不同的基类型_汇总贴:STEP7的复杂数据类型有哪些?
  4. TCP/IP TIME_WAIT状态原理
  5. iOS核心动画之CALayer(1)
  6. FireFox与IE的兼容
  7. CSS浏览器兼容性问题
  8. keil5图标变成白色_电脑桌面图标全部变成白色的解决办法
  9. 年龄大了学Java是爱好还是转型?
  10. aspen怎么做灵敏度分析_不会敲代码怎么做智能分析?用奥威商业智能BI
  11. 4_less中带参数混合
  12. pathinfo函数获取非UTF-8字符集文件名的问题
  13. bzoj 3027: [Ceoi2004]Sweet(母函数+组合数)
  14. 【原创手写笔记】面试准备,关于Adaboost GBDT算法你需要知道的那些
  15. Atitit 2017年的技术趋势与未来的大技术趋势
  16. 工作中常用Linux命令总结一
  17. Java 13 明天发布,最新最全新特性解读
  18. JS逆向之国家企业信用信息公示系统Cookie传递
  19. Java常用术语解释
  20. freeCAD学习笔记二:复制与放置多个相似的实体

热门文章

  1. 用MobaXterm远程连接Centos系统_使用技巧---Linux工作笔记047
  2. ES6新特性_ES6生成器函数实例_第二个实例---JavaScript_ECMAScript_ES6-ES11新特性工作笔记023
  3. 深度学习001---勾股定理
  4. Web前端工作笔记002---json数据查询的方法_json查询大全,JsonSQL数据查询,jfunk数据查询
  5. resnet18 结构
  6. WaitForMultipleObjects函数有效值分析
  7. 东芝M300系列笔记本拆解图片教程 (跟自己电脑很像)
  8. c++ assert() 使用方法
  9. android播放器实现自动播放,Android实现自动播放图片功能
  10. android指南针校准 代码_Android 指南针传感器