80分求助 WA9,10点
查看原帖
80分求助 WA9,10点
467324
LuoMuxiaoxiao楼主2024/1/19 15:07
#include<bits/stdc++.h>
using namespace std;

const int INF = 2147483647, N = 2e3 + 5;

int n, m, u, v, w, dis[N];
bool flag;

vector<pair<int, int> > adja[N];

int main()
{
	int t;
	scanf("%d", &t);
	for(int test = 0; test < t; test++) {
		scanf("%d%d", &n, &m);
		for(int i = 1; i <= n; i++) {
			adja[i].clear();
			dis[i] = INF;
		}
		for(int i = 0; i < m; i++) {
			scanf("%d%d%d", &u, &v, &w);	
			//printf("test1\n");
			if(w >= 0)
				adja[v].push_back(make_pair(u, w));
			adja[u].push_back(make_pair(v, w));
		}
		/*
		for(int i = 1; i <= n; i++) {
			printf("%d:\n", i);
			for(size_t j = 0; j < adja[i].size(); j++) {
				printf("%d ", adja[i][j].first);	
			}
			printf("\n");
			for(size_t j = 0; j < adja[i].size(); j++) {
				printf("%d ", adja[i][j].second);	
			}
			printf("\n");
		}
		*/
		
		dis[1] = 0;
		for(size_t i = 0; i < adja[1].size(); i++) {
			dis[adja[1][i].first] = min(dis[adja[1][i].first], adja[1][i].second);
		}
		
		for(int time = 0; time < n; time++) {
			for(int i = 1; i <= n; i++) {
				for(size_t j = 0; j < adja[i].size(); j++) {
					if(adja[i][j].second + dis[i] < dis[adja[i][j].first] && (dis[i] != INF || dis[adja[i][j].first] != INF)) {
//						printf("%d %d %d %d %d\n", i, adja[i][j].second);
						dis[adja[i][j].first] = adja[i][j].second + dis[i];
					}	
				}
			}
		}
		
		//printf("test1\n");
		flag = false;
		for(int i = 1; i <= n; i++) {
			for(size_t j = 0; j < adja[i].size(); j++) {
				if(adja[i][j].second + dis[i] < dis[adja[i][j].first] && (dis[i] != INF || dis[adja[i][j].first] != INF)) {
					flag = true; 
					break;
				}
			}
			if(flag) break;
		}
		
		/*for(int i = 1; i <= n; i++)
			printf("%d ", dis[i]);
		printf("\n");*/
		//printf("test1\n");
		if(flag)
			printf("YES\n");
		else
			printf("NO\n");
	}
	
}
2024/1/19 15:07
加载中...