题目大意
序列中有一些限制,是否有那么一个序列满足所有限制。
解题思路
把限制看成两点间的距离,跑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 ;
}