#include <bits/stdc++.h>
using namespace std;
const int N=102,M=2002;
int w,m,n,s,t,v,tot,flag;
int head[N],to[M],nextt[M],val[M];
int dis[N],vis[N],num[N];
queue<int> q;
void add(int x,int y,int z){
to[++tot]=y;
nextt[tot]=head[x];
val[tot]=z;
head[x]=tot;
}
void spfa(){
memset(dis,0x7f,sizeof(dis));
q.push(0);
dis[0]=0;
vis[0]=1;
while (!q.empty()){
int k=q.front();
q.pop();
vis[k]=0;
num[k]++;
if (num[k]==n){
flag=1;
return;
}
for (int i=head[k];i;i=nextt[i]){
int y=to[i];
if (dis[y]>dis[k]+val[i]){
dis[y]=dis[k]+val[i];
if (!vis[y]){
q.push(y);
vis[y]=1;
}
}
}
}
}
int main(){
cin>>w;
while(w--){
flag=0;
tot=0;
cin>>n>>m;
memset(to,0,sizeof(to));
memset(val,0,sizeof(val));
memset(nextt,0,sizeof(nextt));
memset(vis,0,sizeof(vis));
memset(head,0,sizeof(head));
memset(num,0,sizeof(num));
for (int i=1;i<=m;i++){
cin>>s>>t>>v;
add(s-1,t,v);
add(t,s-1,-v);
}
spfa();
if (flag) cout<<"false"<<endl;
else cout<<"true"<<endl;
}
return 0;
}
这是我同学的代码,会对这组数据输出true(因为他默认0号点一定是起点,但数据中可能根本没有关于第一个月的记录)
1
35 3
3 5 5
6 8 5
3 8 15