POJ

来源:互联网 发布:php好学还是java好学 编辑:程序博客网 时间:2024/06/06 10:53
/*
POJ 3159
差分约束+SPFA

给n个人派糖果,给出m组数据,每组数据包含A,B,c  三个数,
意思是A的糖果数比B少的个数不多于c,即B的糖果数 - A的糖果数<= c 。
最后求n 比 1 最多多多少糖果。
【解题思路】
这是一题典型的差分约束题。不妨将糖果数当作距离,把相差的最大糖果数看成有向边AB的权值,
我们得到 dis[B]-dis[A]<=w(A,B)。看到这里,我们联想到求最短路时的松弛技术,
即if(dis[B]>dis[A]+w(A,B), dis[B]=dis[A]+w(A,B)。
即是满足题中的条件dis[B]-dis[A]<=w(A,B),由于要使dis[B] 最大,
所以这题可以转化为最短路来求。
这题如果用SPFA 算法的话,则需要注意不能用spfa+queue 来求,会TLE ,而是用 spfa + stack


2012-8-17

//SPFA的队列实现会超时,堆栈实现可以。
//没有负环回路判断,堆栈实现SPFA(有时候堆栈确实比较快)

//G++ 516ms

#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>using namespace std;const int MAXN=30010;const int MAXE=150010;const int INF=0x3f3f3f3f;int head[MAXN];//每个结点的头指针int vis[MAXN];//在队列标志int Q[MAXN];//堆栈int dist[MAXN];struct Edge{    int to;    int v;    int next;}edge[MAXE];int tol;void add(int a,int b,int v)//加边{    edge[tol].to=b;    edge[tol].v=v;    edge[tol].next=head[a];    head[a]=tol++;}void SPFA(int start,int n){    int top=0;    for(int v=1;v<=n;v++)//初始化    {        if(v==start)        {            Q[top++]=v;            vis[v]=true;            dist[v]=0;        }        else        {            vis[v]=false;            dist[v]=INF;        }    }    while(top!=0)    {        int u=Q[--top];        vis[u]=false;        for(int i=head[u];i!=-1;i=edge[i].next)        {            int v=edge[i].to;            if(dist[v]>dist[u]+edge[i].v)            {                dist[v]=dist[u]+edge[i].v;                if(!vis[v])                {                    vis[v]=true;                    Q[top++]=v;                }            }        }    }}int main(){   // freopen("in.txt","r",stdin);  //  freopen("out.txt","w",stdout);    int n;    int M;    int a,b,c;    while(scanf("%d%d",&n,&M)!=EOF)    {        tol=0;//加边计数,这个不要忘        memset(head,-1,sizeof(head));        while(M--)        {            scanf("%d%d%d",&a,&b,&c);            //b-a<=c            add(a,b,c);            //大-小<=c ,有向边(小,大):c        }        SPFA(1,n);        printf("%d\n",dist[n]);    }    return 0;}



原创粉丝点击