P10048
转化一下题意。
你考虑边
然后就好做多了,Floyd 跑完每个点对的最短路后,枚举边
void solve() {
int n = read();
for (int i=1;i<=n;++i) for (int j=1;j<=n;++j) a[i][j] = f[i][j] = read();
for (int k=1;k<=n;++k) for (int i=1;i<=n;++i) for (int j=1;j<=n;++j) f[i][j]=min(f[i][j], f[i][k]+f[k][j]);
for (int i=1;i<=n;++i,putchar(10)) for (int j=1;j<=n;++j) {
int ans=1;
for (int k=1;k<=n;++k) if (i!=k&&j!=k&&f[i][k]+f[j][k]<=f[i][j]) ans=0;
putchar(ans&&i!=j?'1':'0');
}
}