[SCOI2011]糖果 (差分约束)

本文详细解析了差分约束系统及其在解决特定类型问题中的应用,重点介绍了SPFA(Shortest Path Faster Algorithm)算法的实现过程。通过具体实例,展示了如何构建图模型并运用SPFA算法求解最短路径问题,特别关注了等式和不等式的处理技巧。

题目链接

Solution

差分约束乱搞就好了.
需要注意的地方:

  • 对于大于等于的直接联等于,应为等于,因为对于我满足条件而言,等于总是最好的.
  • 对于等于的,注意要建双向边.
  • 然后要开 \(long~long\) .

然后按照套路搞就是了.

Code

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
const int maxn=100008;

struct sj{int to,next,w;}a[maxn*2];
int head[maxn],size,v[maxn];
int dis[maxn],n,m,cnt[maxn];

void add(int x,int y,int w)
{
    a[++size].to=y;
    a[size].next=head[x];
    head[x]=size;
    a[size].w=w;
}

queue<int>q;
void SPFA()
{
    while(!q.empty())
    {
        int x=q.front(); q.pop();
        cnt[x]++;
        if(cnt[x]>=n){cout<<-1<<endl;exit(0);}
        for(int i=head[x];i;i=a[i].next)
        {
            int tt=a[i].to;
            if(dis[tt]<dis[x]+a[i].w)
            {
                dis[tt]=dis[x]+a[i].w;
                if(!v[tt])
                q.push(tt),v[tt]=1;
            }
        }
        v[x]=0;
    }
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int opt,x,y;
        scanf("%d%d%d",&opt,&x,&y);
        if(opt==1) add(x,y,0),add(y,x,0);
        if(opt==2) add(x,y,1);
        if(opt==3) add(y,x,0);
        if(opt==4) add(y,x,1);
        if(opt==5) add(x,y,0);
    }
    memset(dis,-127,sizeof(dis));
    for(int i=1;i<=n;i++)
    q.push(i),dis[i]=1,v[i]=1;
    SPFA();
    /*int kk=192608173;
    for(int i=1;i<=n;i++)
        kk=min(kk,dis[i]);*/
    long long ans=0;
    for(int i=1;i<=n;i++)
    ans+=dis[i];
    if(ans<n)ans=-1;
    //cout<<dis[i]<<endl,ans+=(dis[i]-kk);
    cout<<ans<<endl;
}

转载于:https://www.cnblogs.com/Kv-Stalin/p/9600565.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值