改代码时改成了手写队列...
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int t,n,m;
int dis[10010],sum[10010];
bool vis[10010];
int head[10010],to[10010],nxt[10010],w[10010],cnt;
int a,b,c;
int pre,cur;
inline void add(int u,int v,int k) {
nxt[++cnt]=head[u];
to[cnt]=v;
w[cnt]=k;
head[u]=cnt;
return ;
}
int q[10010],qh,qe;//qh:队首 qe:队尾
inline void ps(int k) { //入队
q[(++qe)%10000] = k;
return ;
}
inline int qp() { //出队+返回
return q[(++qh)%10000] ;
}
inline void xmain() {
cin>>n>>m;
memset(dis,INF,sizeof(dis));memset(vis,0,sizeof(vis));memset(sum,0,sizeof(sum));memset(head,0,sizeof(head));cnt=0;
memset(q,0,sizeof(q));
for(int i=1;i<=m;i++) {
cin>>a>>b>>c;
add(a-1,b,c);
add(b,a-1,-c);
}
for(int i=0;i<=n;i++) add(n+1,i,0);
ps(n+1);
dis[n+1]=0;
vis[n+1]=1;
sum[n+1]=1;
while(qe>qh) {
pre=qp();
vis[pre]=0;
if(sum[pre]-2>=n) {
cout<<"false\n";
qe=qh=0;
return;
}
for(int i=head[pre];i;i=nxt[i]) {
cur=to[i];
if(dis[cur]>dis[pre]+w[i]) {
dis[cur]=dis[pre]+w[i];
sum[cur]=max(sum[cur],sum[pre]+1);
if(!vis[cur]) {
ps(cur);
vis[cur]=1;
}
}
}
}
cout<<"true\n";
return;
}
int main() {
cin>>t;
while(t--) xmain();
return 0;
}