Language: C++

// ConsoleApplication17.cpp : Defines the entry point for the console application.
//



#include "stdafx.h"
#include <string>
#include<cmath>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<iostream>
#include<queue>
#include<tuple>
#include<functional>

using namespace std;

#define rep(i,n) for(long long i = 0; i < (long long)(n); i++)
#define repi(i,a,b) for(long long i = (long long)(a); i < (long long)(b); i++)
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
#define mt make_tuple
#define mp make_pair
#define ZERO(a) memset(a,0,sizeof(a))
template<class T1, class T2> bool chmin(T1 &a, T2 b) { return b < a && (a = b, true); }
template<class T1, class T2> bool chmax(T1 &a, T2 b) { return a < b && (a = b, true); }
#define exists find_if
#define forall all_of

using ll = int32_t; using vll = vector<ll>; using vvll = vector<vll>; using P = pair<ll, ll>;
using ld = long double;  using vld = vector<ld>;
using vi = vector<int>; using vvi = vector<vi>; vll conv(vi& v) { vll r(v.size()); rep(i, v.size()) r[i] = v[i]; return r; }

inline void input(int &v) { v = 0; char c = 0; int p = 1; while (c<'0' || c>'9') { if (c == '-')p = -1; c = getchar(); } while (c >= '0' && c <= '9') { v = (v << 3) + (v << 1) + c - '0'; c = getchar(); } v *= p; }
template <typename T, typename U> ostream &operator<<(ostream &o, const pair<T, U> &v) { o << "(" << v.first << ", " << v.second << ")"; return o; }
template<size_t...> struct seq {}; template<size_t N, size_t... Is> struct gen_seq : gen_seq<N - 1, N - 1, Is...> {}; template<size_t... Is> struct gen_seq<0, Is...> : seq<Is...> {};
template<class Ch, class Tr, class Tuple, size_t... Is>
void print_tuple(basic_ostream<Ch, Tr>& os, Tuple const& t, seq<Is...>) { using s = int[]; (void)s { 0, (void(os << (Is == 0 ? "" : ", ") << get<Is>(t)), 0)... }; }
template<class Ch, class Tr, class... Args>
auto operator<<(basic_ostream<Ch, Tr>& os, tuple<Args...> const& t) -> basic_ostream<Ch, Tr>& { os << "("; print_tuple(os, t, gen_seq<sizeof...(Args)>()); return os << ")"; }
ostream &operator<<(ostream &o, const vvll &v) { rep(i, v.size()) { rep(j, v[i].size()) o << v[i][j] << " "; o << endl; } return o; }
template <typename T> ostream &operator<<(ostream &o, const vector<T> &v) { o << '['; rep(i, v.size()) o << v[i] << (i != v.size() - 1 ? ", " : ""); o << "]";  return o; }
template <typename T>  ostream &operator<<(ostream &o, const set<T> &m) { o << '['; for (auto it = m.begin(); it != m.end(); it++) o << *it << (next(it) != m.end() ? ", " : ""); o << "]";  return o; }
template <typename T>  ostream &operator<<(ostream &o, const unordered_set<T> &m) { o << '['; for (auto it = m.begin(); it != m.end(); it++) o << *it << (next(it) != m.end() ? ", " : ""); o << "]";  return o; }
template <typename T, typename U>  ostream &operator<<(ostream &o, const map<T, U> &m) { o << '['; for (auto it = m.begin(); it != m.end(); it++) o << *it << (next(it) != m.end() ? ", " : ""); o << "]";  return o; }
template <typename T, typename U, typename V>  ostream &operator<<(ostream &o, const unordered_map<T, U, V> &m) { o << '['; for (auto it = m.begin(); it != m.end(); it++) o << *it; o << "]";  return o; }
template <typename T> istream& operator >> (istream& i, vector<T>& o) { rep(j, o.size()) i >> o[j]; return i; }
string bits_to_string(ll input, ll n = 64) { string s; rep(i, n) s += '0' + !!(input & (1ll << i)); reverse(all(s)); return s; }
template <typename T> ostream &operator<<(ostream &o, const priority_queue<T> &v) { auto tmp = v; while (tmp.size()) { auto x = tmp.top(); tmp.pop(); o << x << " "; } o << endl; return o; }

template <typename T> unordered_map<T, ll> counter(vector<T> vec) { unordered_map<T, ll> ret; for (auto&& x : vec) ret[x]++; return ret; };
string substr(string s, P x) { return s.substr(x.fi, x.se - x.fi); }

size_t random_seed; namespace std { using argument_type = P; template<> struct hash<argument_type> { size_t operator()(argument_type const& x) const { size_t seed = random_seed; seed ^= hash<ll>{}(x.fi); seed ^= (hash<ll>{}(x.se) << 1); return seed; } }; }; // hash for various class
namespace myhash { const int Bsizes[] = { 3,9,13,17,21,25,29,33,37,41,45,49,53,57,61,65,69,73,77,81 }; const int xor_nums[] = { 0x100007d1,0x5ff049c9,0x14560859,0x07087fef,0x3e277d49,0x4dba1f17,0x709c5988,0x05904258,0x1aa71872,0x238819b3,0x7b002bb7,0x1cf91302,0x0012290a,0x1083576b,0x76473e49,0x3d86295b,0x20536814,0x08634f4d,0x115405e8,0x0e6359f2 }; const int hash_key = xor_nums[rand() % 20]; const int mod_key = xor_nums[rand() % 20]; template <typename T> struct myhash { std::size_t operator()(const T& val) const { return (hash<T>{}(val) % mod_key) ^ hash_key; } }; };
template <typename T> class uset :public std::unordered_set<T, myhash::myhash<T>> { using SET = std::unordered_set<T, myhash::myhash<T>>; public: uset() :SET() { SET::rehash(myhash::Bsizes[rand() % 20]); } };
uint32_t randxor() { static uint32_t x = 1 + (uint32_t)random_seed, y = 362436069, z = 521288629, w = 88675123; uint32_t t; t = (x ^ (x << 11)); x = y; y = z; z = w; return(w = (w ^ (w >> 19)) ^ (t ^ (t >> 8))); }


static const double EPS = 1e-14;
static const long long INF = 2020202020;
static const long long mo = 1e9 + 7;
#define ldout fixed << setprecision(40) 

int main(void) {
	ll n; input(n);
	vvll g(n, vll(n, 0));

	vector<tuple<ll, ll, ll>> memo;
	rep(i, n) rep(j, n) {
		input(g[i][j]);
		memo.pb(mt(g[i][j], i, j));
	}
	sort(all(memo));
	vector<vector<P>> ret(n);
	ll counter = 0;
	rep(_, memo.size()) {
		counter++;
		ll cost, i, j; tie(cost, i, j) = memo[_];
		// iからjの最短経路を求めます
		priority_queue<tuple<ll, ll>, vector<tuple<ll, ll>>, greater<tuple<ll, ll>>> q;
		vll dist(n, INF);

		q.push(mt(0, i));
		while (!q.empty()) {
			ll c, v; tie(c, v) = q.top(), q.pop();
			if (dist[v] < c)continue;
			dist[v] = c;
			if (v == j) break;
			for (auto x : ret[v]) if (c + x.se < dist[x.fi]) {
				q.push(mt(c + x.se, x.fi));
			}
		}

		if (dist[j] < g[i][j]) {
			cout << -1 << endl;
			return 0;
		}
		else if (dist[j] == g[i][j]) {
		}
		else {
			ret[i].pb(P(j, g[i][j]));
			ret[j].pb(P(i, g[i][j]));
		}
	}

	long long ans = 0;
	rep(i, n) for (auto x : ret[i]) {
		ans += x.se;
	}
	cout << ans / 2 << endl;
	return 0;
}

Compiler output:
a.cc:6:10: fatal error: stdafx.h: No such file or directory
    6 | #include "stdafx.h"
      |          ^~~~~~~~~~
compilation terminated.