re求助 在线IDE能过第一个数据 交上去全re
查看原帖
re求助 在线IDE能过第一个数据 交上去全re
553176
coding_hong楼主2021/11/20 16:58
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <iomanip>
#include <fstream>
#include <vector>
#include <deque>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <sstream>



using namespace std;
int T,t,m,n;
int dis[2005],vis[2005],head[2005],ans[2005];
struct edge {
	int to,w,next;
} e[3005];


int addadge(int u,int v,int w) {

	e[++t].to=v;
	e[t].w=w;
	e[t].next=head[u];
	head[u]=t;
}
queue <int> q;
bool spfa()
{
	dis[1]=0;
	vis[1]=1;
	q.push(1);
	while(!q.empty())
	{
		
		int x=q.front();
		q.pop();
		vis[x]=0;
		for(int i=head[x];i;i=e[i].next)
		{
			int y=e[i].to,z=e[i].w;
			if(dis[y]>dis[x]+z)
			{
				dis[y]=dis[x]+z;
				ans[y]=ans[x]+1;
				if(ans[y]>=m)return true;
				else if(vis[y]==0)
				{
					q.push(y);
					vis[y]=1;
				}
			}
		}
	}
	return false;
}

int main() {

	scanf("%d",&T);
	while(T--) {
		scanf("%d%d",&n,&m);
		memset(head,0,sizeof(head));
		memset(dis,0x3f,sizeof(dis));
		memset(vis,0,sizeof(vis));
		memset(ans,0,sizeof(ans));
		for(int i=0; i<=3005;i++) {
			e[i].next=0;
			e[i].to=0;
			e[i].w=0;
		}
		t=0;

		for(int i=1; i<=m; i++) {
			int u,v,w;
			scanf("%d%d%d",&u,&v,&w);
			addadge(u,v,w);
			if(w>=0)addadge(v,u,w);

		}
	if(spfa())printf("YES\n");
	else printf("NO\n");
	}

	return 0;
}

2021/11/20 16:58
加载中...