#include <stdio.h>#define MAX 10000int path[MAX][MAX];bool sign[MAX][MAX];int ans;int n;int floyd(){ for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { if(i!=j && i!=k && k!=j) //自己与自己的边不存在 { if(path[i][j] > path[i][k] + path[k][j]) //因为不可能再次出现最短路径所以一旦出现就是错误 return -1; else if(path[i][j] == path[i][k] + path[k][j] && !sign[i][j]) //还需要判断是否计算过 {ans--; sign[i][j] = true;} //重边可以去掉一个 } }}int main(){ //freopen("read.txt", "r", stdin); int T; scanf("%d", &T); int co = 1; while(T--) { printf("Case %d: ", co++); scanf("%d", &n); for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) {scanf("%d", &path[i][j]); sign[i][j] = false;} ans = n*(n-1); //每个点到其它顶点的最多的边数,因为是有向的 if(floyd() == -1) printf("impossible\n"); else printf("%d\n", ans); } return 0;}