如果能进行松弛操作,那么肯定失败了,
如果这两个节点之间不能由第三个点进行松弛,那么肯定就是得架设电缆。
ac代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<cmath>
#include<cstdlib>
#include<list>
#include<queue>
#define mm(a,b) memset(a,b,sizeof(a))
#define ACCELERATE (ios::sync_with_stdio(false),cin.tie(0))
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#define MAXN 0x3f3f3f3f3f3f3f3f
#define PI acos(-1.0)
#define E exp(1.0)
using namespace std;
//#define debug
int main()
{
#ifdef debug
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
#endif // debug
int book[105][105];
int e[105][105];
int casei=1;
int k,n;
int a;
scanf("%d",&k);
while(k--){
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j)
e[i][j]=MAXN;
else e[i][j]=0;
for(int i=1;i<n;i++){
for(int j=1;j<=i;j++){
scanf("%d",&a);
e[i+1][j]=e[j][i+1]=a;
}
}
printf("Case #%d:\n",casei++);
mm(book,0);
int tot=0;
int flag=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=i-1;j++){
if(i!=j){
int num=0;
for(int k=1;k<=n;k++){
if(e[i][k]+e[k][j]<e[i][j]) flag=1;
if(e[i][k]+e[k][j]!=e[i][j]) num++;
}
if(num==n-2){
book[j][i]=1;
tot++;
}
}
}
}
if(flag==1) {
printf("Need better measurements.\n\n");
continue;
}
printf("%d\n",tot);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(book[i][j]) printf("%d %d %d\n",i,j,e[i][j]);
}
}
printf("\n");
}
return 0;
}
/*
2
3
100
200 100
3
100
300 100
*/