Subtask1 #2 WA求调
查看原帖
Subtask1 #2 WA求调
1351086
birdyan楼主2024/9/7 14:24

改代码时改成了手写队列...

#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;
}
2024/9/7 14:24
加载中...