spfa85求助!玄2关
查看原帖
spfa85求助!玄2关
113001
xuhrrr楼主2024/3/27 22:32

代码如下:我挺好奇的,样例就没过但是这个代码是过了模板然后进行修改的,查了半天错还是没发现错在哪儿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;
}
2024/3/27 22:32
加载中...