社区讨论

关于差分之后做法

P1993小 K 的农场参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mi7cphpj
此快照首次捕获于
2025/11/20 19:31
4 个月前
此快照最后确认于
2025/11/20 19:31
4 个月前
查看原帖
首先差分建边 这题正解是跑最长路同时dfs判环(或最短路) SPFA会很慢,但为什么WA? #60分代码
CPP
#include<iostream>
#include<queue>
using namespace std;
int n,m,S,num,visit[10005],dis[10005],tm[10005],head[100005];
struct note {
    int to,next,cost;
} a[100005];
void add(int x,int y,int z) {
    num++;
    a[num].to=y;
    a[num].cost=z;
    a[num].next=head[x];
    head[x]=num;
}
bool spfa() {
    queue <int > q;
    q.push(S);
    for(int i=1; i<=n; i++) {
        dis[i]=-1;
    }
    dis[S]=0;
    visit[0]=1;
    while(!q.empty()) {
        int t=q.front();
        q.pop();
        for(int i=head[t]; i; i=a[i].next) {
            int v=a[i].to;
            if(dis[v]<dis[t]+a[i].cost) {
                dis[v]=dis[t]+a[i].cost;
                tm[v]++;
                if(tm[v]==n) {
                    return 0;
                }
                if(!visit[v]) {
                    visit[v]=1;
                    q.push(v);
                }
            }
        }
    }
    return 1;
}
int main() {
    cin>>n>>m;
    S=0;
    for(int i=1; i<=n; i++) {
        add(0,i,0);
    }
    int t,x,y,z;
    for(int i=1; i<=m; i++) {
        cin>>t;
        if(t==1) {
            cin>>x>>y>>z;
            add(y,x,z);
        }
        if(t==2) {
            cin>>x>>y>>z;
            add(x,y,-z);
        }
        if(t==3) {
            cin>>x>>y;
            add(x,y,0);
            add(y,x,0);
        }
    }
    if(spfa()) {
        cout<<"Yes";
    } else cout<<"No";
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...