题意分析
看了一眼题意,发现FLOYD可以做,其实就是判断是否满足边相加的关系成立。
需要注意的是,有可能有这样的数据,
3 2
1 2 10
3 3 -15
这个也是true的,也就是说,当边不满足判断条件的时候,可以认为补充上一些边。
或者说,只有发现两边相加不等于第三边的时候,才算false。
这道题也可以用带权并查集来做。
一看数据范围才100当然用Floyd来做啦!
代码总览
#include<bits/stdc++.h>
using namespace std;
const int nmax = 105;
const int INF = 0x3f3f3f3f;
int w[nmax][nmax];
int t,n,m;
bool floyd(){
for(int k = 0;k<=n;++k){
for(int i = 0;i<=n;++i){
for(int j = 0;j<=n;++j){
if(w[i][k] != INF && w[k][j] != INF && w[i][j] != INF){
if(w[i][j] != w[i][k] + w[k][j]) return false;
}else if(w[i][k] != INF && w[k][j] != INF){
w[i][j] = w[i][k] + w[k][j];
}else if(w[i][k] != INF && w[i][j] != INF){
w[k][j] = w[i][j] - w[i][k];
}else if(w[k][j] != INF && w[i][j] != INF){
w[i][k] = w[i][j] - w[k][j];
}
}
}
}
return true;
}
int main(){
scanf("%d",&t);
while(t--){
memset(w,INF,sizeof w);
scanf("%d %d",&n,&m);
int u,v,ww;
for(int i = 0;i<m;++i){
scanf("%d %d %d",&u,&v,&ww);
w[u-1][v] = ww;
}
printf("%s\n",floyd()?"true":"false");
}
return 0;
}
&spm=1001.2101.3001.5002&articleId=80056882&d=1&t=3&u=a65c512a03ad4327b5a2ee6328dbde84)
508

被折叠的 条评论
为什么被折叠?



