SPFA36分求助
查看原帖
SPFA36分求助
232507
OK咯莫名其妙楼主2021/8/19 22:06
#include<bits/stdc++.h>
using namespace std;
const int maxn=200010;
const int maxxn=600010;
struct e{
	int u,v,w,nxt;
}edge[maxxn];
int head[maxn],vis[maxn],dis[maxn],tot,n,m,cnt[maxn],flag;
void add(int u,int v,int w){
	edge[++tot].u=u;
	edge[tot].v=v;
	edge[tot].w=w;
	edge[tot].nxt=head[u];
	head[u]=tot;
}
queue<int> q;
void spfa(int s){
    memset(vis,0,sizeof(vis));
    memset(dis,0x3f,sizeof(dis));
    memset(cnt,sizeof(cnt),0);
    q.push(s);
    dis[s]=0;
    vis[s]=1;
    while(!q.empty()){
        int x=q.front();
        cnt[x]++;
        q.pop();
        vis[x]=0;
        if(cnt[x]>=n){
        	flag=1;
        	return ;
		}
        for(int i=head[x];i;i=edge[i].nxt){
            int to=edge[i].v;
            if(dis[to]>dis[x]+edge[i].w){
                dis[to]=dis[x]+edge[i].w;
                if(!vis[to])q.push(to),vis[to]=1;
            }
        }
    }
}
int main(){
	int T;
	cin>>T;
	while(T--){
	flag=0;
	for(int i=0;i<maxxn;i++) edge[i].nxt=0;
	for(int i=0;i<maxn;i++) head[i]=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
	int x,y,z;
	cin>>x>>y>>z;
	if(z<0){
		add(x,y,z);
	}
	else
	{
		add(x,y,z);
		add(y,x,z);
	}
	}
	spfa(1);
	if(flag==1)
	cout<<"YES"<<endl;
	else
	cout<<"NO"<<endl;
    tot=0;
	}
	
}
2021/8/19 22:06
加载中...