Dammit that paper is awesome. The thing is, the dwarf fortress maps change a whole lot more than your average map. The algorithm might require too much changing, I'd have to play with it to see...
I though of a system where certain points where marked as "central points". Basically whenever a dwarf (or something) passes through a tile, it starts marking it, when it's been passed a certain amount of times it's considered a "key point". A couple other things that might influence if a tile (or area) is a key point is how many places it comunicates (say if it's an up-down stair) and how close it is to other keypoints (the farther the easier it is).
The craziest case would be building an up-down stair that makes a tile become a key-point and makes another keypoint stop existing.
The most inefficient moment is when a key point appears. Keypoints "precalculate" the optimal path distance of all tiles a certain distance from them, say until three other keypoints are reached. This is done with a flooding algorithm*, the nice thing is that this algorithm is a cell-automata based algorithm, so any change in the map doesn't trigger a full recalculation, but only recalculates the changed parts. It might take some time for the change to occur, but we aren't expecting optimal pathing and all knowing from the dwarves, let's give them some time to "learn" the new best path. A single tile could have the distances to many keypoints (though you should wonder why it isn't a keypoint itself if it's so centric).
Now we can calculate the optimal paths between keypoints. Because we extend the distances we calculate from a keypoint A until we have reached keypoints B, C and D (for example), we can do a map with diferent distances between the keypoints. We can use Dijkstra to find that the best path from A to E (which connects with B, C and F) is through C, for example. Hell, if the number of keypoints is small enought (and I mean something less than 50,000) floyd's algorithm could work, on the expectation that changing the optimal path between keypoints, or changing keypoints themselves is relatively rare (and it should). There could be cases where it actually finds a non-optimal solution by much, but if the number of keypoints that need to be found before stopping the flow algorithm.
When we want to find the optimal path between A (say a dwarf) and B (a barrel of dwarven rum), first A and B would find their closest "keypoint" (lets call them Ka for the dwarf and Kb for the rum). We find the optimal path between Ka and Kb. The dwarf then chooses a Keypoint Ks from all the Keypoints A has a measured distance to the Keypoint along the path that is closest to Kb. The dwarf then uses a greedy algorithm, reading the distance in each tile, to travel to Ks. From there he uses the same greedy algorithm to travel to Kb. Once the dwarf reaches Kb, the optimal path from B to Kb is found (again greedy method), and then the dwarf travels this path "backwards" to get to his precious alcohol. Now the dwarf if finally happy.
The biggest issue is how much the flooding would take in frames. If it happens separately, it might be reasonable. Another solution is to have a "step" in the flow to occur, but this might make a drastic map change take a couple hundred frames. None the less if the game runs at 100 FPS (not graphical, but logical step frames) this might not be that much of a problem.
Again I guess I'd have to do some math, and then experiment a bit (because algorithm efficiency only works when all steps take the same amount of time, which isn't so) and see what happens...
*The flooding algorithm works like this:
//Given that all tiles start with a distance "infinite" except the starting tile (which has 0)
flooding(tile):
for adj in adjacent_tiles(tile):
if adj.is_passable and tile.distance < (adj.distance + 1):
adj.distance = tile.distance + 1
flooding(adj)