代码如下:我挺好奇的,样例就没过但是这个代码是过了模板然后进行修改的,查了半天错还是没发现错在哪儿qaq
#include <iostream>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstring>
#define maxn 100005
#define inf 0x7fffffff
using namespace std;
int n,m,cnt0;
queue<int>q;
int vis[maxn],cnt[maxn],to[maxn],nxt[maxn],head[maxn],val[maxn];
long long dis[maxn];
void add(int u,int v,int w){
to[++cnt0] = v;
nxt[cnt0] = head[u];
val[cnt0] = w;
head[u] = cnt0;
}
bool spfa(){
for(int i = 0 ; i <= n ; ++i){
dis[i] = inf;
}
dis[0] = 0;
vis[0] = 1;
cnt[0]++;
q.push(0);
while(!q.empty()){
int u = q.front();
vis[u] = 0;
q.pop();
for(int i = head[u] ; i ; i = nxt[i]){
if(dis[to[i]] >= dis[u] + val[i]){
dis[to[i]] = dis[u] + val[i];
if(!vis[to[i]]){
vis[to[i]] = 1;
cnt[to[i]]++;
q.push(to[i]);
if(cnt[to[i]] > n){
return false;
}
}
}
}
}
return true;
}
int main()
{
cin >> n >> m;
for(int i = 1 ; i <= n ; ++i){
add(0,i,0);
}
for(int i = 1 ; i <= m ; ++i){
int a,b,c,op;
cin >> op;
if(op == 1){
//xa >= xb + c <-> xb - xa <= -c
cin >> a >> b >> c;
add(a,b,-c);
}
if(op == 2){
//xa <= xb + c
cin >> a >> b >> c;
add(b,a,c);
}
if(op == 3){
cin >> a >> b;
add(a,b,0);
add(b,a,0);
}
}
if(!spfa()){
cout << "No" << endl;
}
else{
cout << "Yes" << endl;
}
return 0;
}