POJ 3159 Candies(SPFA+栈)差分约束[通俗易懂]

POJ 3159 Candies(SPFA+栈)差分约束

大家好,又见面了,我是全栈君。

题目链接:http://poj.org/problem?id=3159

题意:给出m给 x 与y的关系。当中y的糖数不能比x的多c个。即y-x <= c  最后求fly[n]最多能比so[1] 多多少糖?

差分约束问题, 就是求1-n的最短路,  队列实现spfa 会超时了,改为栈实现,就可以 


有负环时,用栈比队列快


数组开小了,不报RE,报超时 ,我晕


#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <algorithm>
const int N = 210;
const int maxn = 30100;
const int maxm = 200000;
#define FOR(i,a,b) for(int i=a;i<b;i++)
#define init(a) memset(a,0,sizeof(a))
#define MIN INT_MIN
#define MAX INT_MAX
#define LL long long
using namespace std;
int max(int a,int b){if(a>b)return a; else return b;}
int min(int a,int b){if(a<b)return a; else return b;}
const int INF=0x3f3f3f3f;
struct node
{
    int v,w;
    int next;
}edge[maxm];
int head[maxn];
bool vis[maxn];
int dis[maxn];
int cnt;
void add(int a,int b,int w)//加边
{
    edge[cnt].v=b;
    edge[cnt].w=w;
    edge[cnt].next=head[a];
    head[a]=cnt++;
}
void SPFA(int s,int n)
{
    //stack<int>stk;
    int stk[100000];
    int top = 0;
  
    //stk.push(s);
    stk[top++] = s;
    FOR(i,1,n+1)
    {dis[i] = INF;
    vis[i] = 0;
    }
    dis[s] = 0;
    vis[s] = 1;
    while(top!=0)
    {
        int u=stk[--top];
        //stk.pop();
        vis[u]=false;
        for(int i=head[u];i!=-1;i=edge[i].next)
        {
            int v=edge[i].v;
            if(dis[v]>dis[u]+edge[i].w)
            {
                dis[v]=dis[u]+edge[i].w;
                if(!vis[v])
                {
                    vis[v]=true;
                    stk[top++] = v;
                }
            }
        }

    }
}
void initt()
{
    cnt=0;
    memset(head,-1,sizeof(head));
}
int main()
{
    int n,m;
    int a,b,c;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        initt();
        while(m--)
        {
            scanf("%d%d%d",&a,&b,&c);
            add(a,b,c);
        }
        SPFA(1,n);
        printf("%d\n",dis[n]);
    }
    return 0;
}


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115400.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm安装python3.6_python安装教程

    pycharm安装python3.6_python安装教程Pycharm安装+python3.9+配置过程一、安装Pycharm+python3.9Pycharm官网下载:https://www.jetbrains.com/pycharm/download/#section=windows点击Community下的Download进行下载。Python3.9官网下载:https://www.python.org/点击Download下的python3.9.2进入:下拉至最下面,点击windowsem

    2022年8月27日
  • w3c css规范_jquery是w3c标准吗

    w3c css规范_jquery是w3c标准吗2014年10月7日,W3CCEOJeffJaffe在W3C官方博客发表文章,讨论在Web技术标准制定过程中应当如何达成一致认同——是通过正式的认同流程(formalconsensusprocess)还是由标准编辑(informededitor)非正式的收集意见而达成认同。一致认同一直是W3C的核心价值,但WHATWG正在实行另外一种达成认同的方式,技术标准的编辑们通过他们的判断,决定…

    2022年9月17日
  • JavaScript如何判断是否为数字?

    JavaScript如何判断是否为数字?JavaScript如何判断是否为数字?方法1:使用isNaN()函数isNaN()函数是js自带的全局函数,isNaN()函数用于检查其参数是否是非数字值。如果值x是特殊的非数字值NaN(或者能被转换为这样的值),返回的值就是true;如果值x是其他值,则返回false。isNaN()的缺点就在于null、空格以及空串会被按照0来处理NaN:NotaNumber<script>document.write(isNaN(123));//数字-

    2022年6月29日
  • springcloud微服务搭建_域名301重定向教程

    springcloud微服务搭建_域名301重定向教程前言1.由于我只有一台nginx服务器,那么想要实现一个服务器的多个网站的搭建,在html目录下建立多个文件夹,并用url转发使得不同的二级域名指向html文件夹下的不同子文件夹,这样做便能做到“多个网站”的效果。2.url转发也能够使得一个网站拥有几个域名比如wikipedia.com和wikipedia.net都指向了wikipedia.org。当你访问wikipedia.com或wikipedia.net的时候,跳转出来的页面是wikipedia.org的页面3.重定向是带有状态码的响应,我

    2022年10月19日
  • 记一次修改sga大小之后出现的一系列报错

    记一次修改sga大小之后出现的一系列报错

    2021年7月5日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号