POJ 3159 Candies(差分约束+SPFA )

来源:互联网 发布:mysql 索引 编辑:程序博客网 时间:2024/06/09 18:34

题目大意:

n个小孩,m个关系

A   B   c : 表示小孩A认为小孩B的糖果不能比自己多c个

方法:

这道题考察的是差分约束

首先建立不等关系

Dis[b] - Dis[a] <= c

将每个关系看成是有向图的一条边,SPFA求最短路

注意:SPFA+队列会超时(其实我是WA), 但是用SPFA+堆栈就莫名其妙的AC了

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;#pragma comment(linker, "/STACK:1024000000")#define LL long longconst int mod=1e9+7;const int INF=0x3f3f3f3f;const double eqs=1e-9;const int MAXN=150010;struct node{    int v,w,next;} Edge[MAXN*3];int Dis[MAXN*3],head[MAXN*2],vis[MAXN*3],top;int que[MAXN*3];void Add(int u,int v,int w){    Edge[top].v = v;    Edge[top].w = w;    Edge[top].next = head[u];    head[u] = top++;}void SPFA(int n){    int s = 0;    int e = 0;    for(int i=1; i<=n; i++)    {        Dis[i] = INF;        vis[i] = false;    }    Dis[1] = 0;    vis[1] = true;    que[++s] = 1;    while(s)    {        int u = que[s--];        vis[u] = false;        for(int i=head[u]; i!=-1; i=Edge[i].next)        {            int w = Edge[i].w;            int v = Edge[i].v;            if(Dis[v] > Dis[u] + w)            {                Dis[v] = Dis[u] + w;                if(!vis[v])                {                    vis[v] = true;                    que[++s] = v;                }            }        }    }}int main(){    int n,m,u,v,w;    while(~scanf("%d%d",&n,&m))    {        memset(head, -1, sizeof(head));        top = 0;        while(m--)        {            scanf("%d%d%d",&u,&v,&w);            Add(u,v,w);        }        for(int i=1;i<=n;i++)            Add(0,i,0);        SPFA(n);        printf("%d\n",Dis[n]);    }    return 0;}



0 0
原创粉丝点击