rt,样例过了莫名就wa了
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdio>
#include<queue>
using namespace std;
queue<int> q;
inline int read(){
char c;int f=1,res=0;
while(c=getchar(),!isdigit(c)) if(c=='-') f*=-1;
while(isdigit(c)) res=res*10+c-'0',c=getchar();
return res*f;
}
const int maxn=5005;
int n,m,opt;
int ver[maxn],hd[maxn],nxt[maxn],w[maxn],dis[maxn],num[maxn];
bool vis[maxn];
int cnt=1;
inline void add_edge(int u,int v,int d){
ver[++cnt]=v;w[cnt]=d;
nxt[cnt]=hd[u];hd[u]=cnt;
}
inline bool spfa(int node){
dis[node]=0;
q.push(node);
vis[node]=true;
num[node]++;
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=false;
for(int i=hd[u];i;i=nxt[i])
if(dis[ver[i]]>dis[u]+w[i]){
dis[ver[i]]=dis[u]+w[i];
if(!vis[ver[i]]){
q.push(ver[i]);
vis[ver[i]]=true;
num[ver[i]]++;
if(num[ver[i]]==n+1)
return false;
}
}
}
return true;
}
int main(){
n=read();
m=read();
memset(dis, 0x3f3f3f3f, sizeof(dis));
for(int i=1;i<=m;i++){
opt=read();
if(opt==1) {
int a,b,c;
a=read();
b=read();
c=read();
add_edge(a,b,-c);
}
if(opt==2) //dis[a]-dis[b]<=c
{ int a,b,c;
a=read();b=read();c=read(); //dis[b]-dis[a]>=-c
add_edge(b,a,c);//等价于b到a有一条边权为c
}
if(opt==3){ //dis[a]=dis[b]
int a,b; //dis[a]<=dis[b]+0
a=read();b=read();
add_edge(b,a,0);
add_edge(a,b,0);//dis[b]<=dis[a]+0
}
}
for(int i=1;i<=n;i++){
add_edge(n+1,i,0);
}
bool flag=spfa(n+1);
if(spfa(n+1)==false) cout<<"No";
else{
cout<<"Yes";
}
return 0;
}