15pts求调
查看原帖
15pts求调
958865
aldzsfs楼主2023/7/26 11:23
#include<bits/stdc++.h>
using namespace std;
int n,m,op,u,v,w,num,head[6000],dis[6000],pd[6000],t[6000];
queue<int>q;
struct edge{int next,to,cost;}g[20000];
void add(int a,int b,int c){g[++num]=(edge){head[a],b,c};head[a]=num;}
int main(){
	cin>>n>>m;
	while(m--){
		scanf("%d%d%d",&op,&u,&v);
		if(op==1)	scanf("%d",&w),add(u,v,-w);
		else if(op==2)  scanf("%d",&w),add(v,u,w);
		else    add(u,v,0),add(v,u,0);
	}
	for(int i=1;i<=n;++i)   add(0,i,0),dis[i]=INT_MAX;
	q.push(0);
	dis[0]=0;
	pd[0]=1;
	t[0]=1;
	while(q.size()){
		u=q.front();
		q.pop();
		pd[u]=0;
		for(int i=head[u];i;i=g[i].next){
			v=g[i].to,w=g[i].cost;
			if(dis[v]>1ll*dis[u]+w){
				dis[v]=dis[u]+w;
				if(!pd[v]){
					if(++t[v]>n+1)  return puts("NO"),0;
					pd[v]=1;
					q.push(v);
				}
			}
		}
	}
	return puts("Yes"),0;
}
2023/7/26 11:23
加载中...