题目大意
序列中有一些限制,是否有那么一个序列满足所有限制。
解题思路
把限制看成两点间的距离,跑floyd,看是否所有边都是最短路。
code
#include<set>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
using namespace std;
int const maxn=100;
int n,m,w,f[maxn+10][maxn+10];
int main(){
freopen("d.in","r",stdin);
freopen("d.out","w",stdout);
scanf("%d",&w);
fo(cas,1,w){
scanf("%d%d",&n,&m);
memset(f,200,sizeof(f));int null=f[0][0],ok=1;
fo(i,1,m){
int s,t,v;scanf("%d%d%d",&s,&t,&v);
if((f[s][t]!=null)&&(f[s][t]!=v)){
ok=0;
break;
}
f[s][t]=v;
}
fo(k,1,n){
fo(i,1,k){
fo(j,k+1,n){
int tmp=0;
if(f[i][j]!=null)tmp++;
if(f[i][k]!=null)tmp++;
if(f[k+1][j]!=null)tmp++;
if((tmp==3)&&(f[i][j]!=f[i][k]+f[k+1][j])){
ok=0;
break;
}
if(tmp==2){
if(f[i][j]==null)f[i][j]=f[i][k]+f[k+1][j];
if(f[i][k]==null)f[i][k]=f[i][j]-f[k+1][j];
if(f[k+1][j]==null)f[k+1][j]=f[i][j]-f[i][k];
}
}
if(!ok)break;
}
if(!ok)break;
}
if(ok)printf("true\n");
else printf("false\n");
}
return 0;
}