萌新学妹刚学OI,不知道前向星哪里写挂了
查看原帖
萌新学妹刚学OI,不知道前向星哪里写挂了
385145
神眷之樱花楼主2021/4/13 19:52
#include<cstdio>
#include<queue>
#include<cstring>
const int N = 1e2 + 5;
const int M = 1e3 + 5;
struct edge {
	int next,to,w;
}a[M << 1];
int t,n,m,head[N],a_size = 0,cnt[N],dis[N];
bool vis[N];
inline void add(int u,int v,int w) {
	a[++a_size] = (edge){head[u],v,-w};
	head[u] = a_size;
	a[++a_size] = (edge){head[v],u,w};
	head[v] = a_size;
}
bool SPFA() {
	std::queue<int> q;
	for(int i = 0; i<= n; i++) q.push(i),vis[i] = true;
	while(!q.empty()) {
		int u = q.front();
		if(cnt[u] >= n) return false;
		q.pop(),vis[u] = false;
		for(int i = head[u]; i; i = a[i].next) {
			int v = a[i].to,w = a[i].w;
			if(dis[v] > dis[u] + w) {
				dis[v] = dis[u] + w;
				cnt[v] = cnt[u] + 1;
				if(!vis[v]) q.push(v),vis[v] = true;
			}
		}
	}
	return true; 
}
inline int read() {
	int x = 0,flag = 1;
	char ch = getchar();
	while(ch < '0' || ch > '9'){if(ch == '-')flag = -1;ch = getchar();}
	while(ch >='0' && ch <='9'){x = (x << 3) + (x << 1) + ch - 48;ch = getchar();}
	return x * flag;
}
int main() {
	t = read();
	while(t--) {
		n = read(),m = read();
		memset (head,0,sizeof(head));
        memset (vis,0,sizeof(vis));
        memset (dis,0,sizeof(dis));
        memset (cnt,0,sizeof(cnt));
		for(int i = 1; i <= m; i++) {
			int u = read(),v = read(),w =read();
			add(u - 1,v,w);
		}
		bool flag = SPFA();
		if(flag) puts("true");
		else puts("false");
	}
	return 0;
}
2021/4/13 19:52
加载中...