#3002. 修建道路

内存限制:128 MiB 时间限制:10 Sec

题目描述

       现在你手头有一张某个国家的地图,它是由N行M列的长方形的网格组成的。这个国家有很多城市,每个城市都占据地图中的某一格。你的任务是要建一些路来连接某几对城市。不过,可能会有一些讨厌的石头阻碍你,每个石头有可能会占据多个格,你可以摧毁它,只是要花些钱罢了。当然了,你肯定希望自己在这个事情上少花点钱。
 
地图是以字符的形式给你的。第i行的第j个字符表示第i行第j个方格的情况。每个格子可能有如下的情况:
•     '.' 表示空地。
•     '!', '@', '#', or '$' 表示一个城市。这4种字符中的每一种都会在地图上出现0或者2次。
•     'a'-'z', 'A'-'Z', or '0'-'9' 表示这个方格里有石头。
 
有些格子中的石头是用同一个字符来代表的,这表示它们是被同一块石头占据的。被同一块石头占据的格子之间将会是互相连接(四连通)的(当然要石头被摧毁后才能走)。这也就是说,如果你想从C1走到C2,那必须存在以下两种情况中的至少一种:
•     C1和C2直接相邻
•     存在一个格子C3,C3和C1相邻,而C3又和C2相连接。
 
不同的石头用不同的字符标识,而摧毁它们所花的钱也是不一样的
•     'a' - 'z': 1 - 26
•     'A' - 'Z': 100 - 2,600
•     '1' - '9': 10,000 - 90,000
•     '0': 100,000
 
你要在被相同字符表示的每对城市之间修路。每条路必须是连续的,从一个城市出发,到另一个城市结束。当然了,路不能修到地图的外面去,路也不能经过没有被摧毁的石头。最后你要输出在修好路的情况下,摧毁石头所需花费的最小钱数。
 
Notes
-      你可以假定道路非常的窄,可以随意互相交叉。
-      道路可以任意通过任意城市。
 

输入格式

第一行包含两个整数NM,表示地图的规模。接下来的N行包含N个字符串,每个字符串有M个字符,表示地图的信息。每个字符只能是 '.', 'a'-'z', 'A'-'Z', '0'-'9', '!', '@', '#', 或 '$'。四种代表城市的符号在地图上会出现0或2次。整张地图至少会有2个城市。

输出格式

表示成功修建道路所需的最小花费。如果你的答案与标准输出一致,那么该测试点得满分,否则得零分。

样例

样例输入


			
【输入样例1】
2 4
!1.!
aab2
【输出样例1】
3
【输入样例2】
4 2
#@
A.
A1
@#
【输出样例2】
100

【数据规模和约定】
100%的数据中N , M ≤ 50。
被同一块石头占据的格子之间是互相连通的(前面好像已经说过了)。

样例输出


			

数据范围与提示