编号从
1
到
分治+floyd
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<bitset>
#include<cassert>
#include<cstring>
#include<complex>
#include<iostream>
#include<algorithm>
#define pi acos(-1)
#define inf (1<<30)
#define INF (1<<62)
#define y1 bflaisfnmasf
#define y2 fsafgmalg
#define tm afnsjkf
#define j1 sfakf
#define j2 fasndfkas
#define CLR(x,f) memset(x,f,sizeof(x))
#define CPY(x,y) memcpy(x,y,sizeof(x))
#define prt(x) cout<<#x<<":"<<x<<" "
#define prtn(x) cout<<#x<<":"<<x<<endl
#define huh(x) printf("--------case(%d)--------\n",x)
#define travel(x) for(Edge *e=h[x];e;e=e->n)
#define TL
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
typedef long long ll;
int n;
const int M=305;
void Min(int &x,int y){
if(x==-1||x>y)x=y;
}
struct mat{
int v[M][M];//long long?
void calc(int k){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(v[i][k]!=-1&&v[k][j]!=-1)Min(v[i][j],v[i][k]+v[k][j]);
}
}mat[10];
int allc;
long long ans=0;
void div(int cas,int l,int r){
if(l==r){
for(int i=1;i<=n;i++){
if(i==l)continue;
for(int j=1;j<=n;j++){
if(j==l)continue;
ans+=mat[cas].v[i][j];
}
}
return;
}
int mid=l+r>>1;
allc++;
mat[allc]=mat[cas];
for(int i=l;i<=mid;i++)
mat[allc].calc(i);
div(allc,mid+1,r);
mat[allc]=mat[cas];
for(int i=mid+1;i<=r;i++)
mat[allc].calc(i);
div(allc,l,mid);
allc--;
}
int main(){
scanf("%d",&n);
allc=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&mat[allc].v[i][j]);
div(allc,1,n);
allc--;
cout<<ans<<endl;
return 0;
}