查看原帖
194790
祸榊__楼主2020/10/7 13:19

为什么我这样写只有20,加了一句vis[now]=false就A了

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define li(i,j,k) for(int i=j ; i<=k ; i++)
#define si(i,j,k) for(int i=j ; i>=k ; i--)
const int INF=2147483647;
const int MAX_N=40001;
const int MAX_M=40001;
int cnt[MAX_N];//表示从点1开始到i点需要经过多少点 
int dis[MAX_N];
int head[MAX_M],tot;
bool vis[MAX_N];
int n,m;
struct yzy{
	int to,val;
	int next;
}Edge[MAX_M<<1];
priority_queue<int,vector <int> ,greater <int> >q;
void add(int u,int v,int w){
	tot++;
	Edge[tot].val=w;
	Edge[tot].to=v;
	Edge[tot].next=head[u];//下一条边,不是边指向的点 
	head[u]=tot;//更新这个点所指的边 
	return ;
}
bool SPFA(int s){
	fill(dis+1,dis+n+1,INF);//初始化 
	memset(cnt,0,sizeof(cnt));
	memset(vis,false,sizeof(vis));
	cnt[s]=1;
	dis[s]=0;
	vis[s]=true;
	q.push(s);
	while(!q.empty()){
		int now=q.top();
		q.pop();
		//vis[now]=false;
		for (int i=head[now] ; i!=-1 ; i=Edge[i].next){//i指的是边 
			int to=Edge[i].to;
			if(dis[to]>dis[now]+Edge[i].val){//
				dis[to]=dis[now]+Edge[i].val;
				cnt[to]=cnt[now]+1;
				if(cnt[to]>=m)//有负环
					return 1; 
				if(!vis[to]){
					q.push(to);
					vis[to]=true;	
				}
			}
		}
	}
	return 0;
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&m);
		while(!q.empty())q.pop();//清空 
		memset(head,-1,sizeof(head));
		memset(Edge,0,sizeof(Edge));
		tot=-1;
		li(i,1,m){
			int u,v,w;
			scanf("%d%d%d",&u,&v,&w);
			if(w>=0)add(u,v,w),add(v,u,w);
			else add(u,v,w);
		}
		if(SPFA(1))printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}
2020/10/7 13:19
加载中...