AtCoder BC079 D: Wall

問題

https://beta.atcoder.jp/contests/abc079/tasks/abc079_d

解法

各数字を1に書き換えるコストが最小になるようにし、その合計を出せば良い。

「1に書き換える最小コスト」=「1への最短距離」と考えることが出来るので、事前にワーシャルフロイド法などで最短距離を求めておけば、あとは各Aijについて加算していけばよい。

実装

#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstdlib>

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)   FOR(i,0,n)
#define MOD 1000000007

using namespace std;
 
typedef long long int ll;

const ll INF=(ll)1e18;

int main(){
    int H,W;

    cin >> H >> W;

    int c[10][10];

    REP(i,10)REP(j,10){
        int tmp;
        cin >> tmp;
        c[i][j] = tmp; 
    }

    REP(i,10)REP(j,10)REP(k,10){
        c[j][k] = min(c[j][k], c[j][i] + c[i][k]);
    }

    int ans = 0;
    REP(i,H)REP(j,W){
        int a;
        cin >> a;
        if(a != -1 && a != 1){
            ans += c[a][1];
        }
    }

    cout << ans << endl;

}