POJ 3159 【朴素的差分约束】

好吧终于知道什么是“高大上”的差分约束了。嗷嗷

题意:

小朋友们分糖果,某个小朋友不想另外一个小朋友分到的糖果数比自己多N块以上。

求编号为N的小朋友最多比编号为1的小朋友多分多少块糖果。

思路:

差分约束,用最短路做。

这题用SPFA.

查分约束的学习感谢博客:http://www.cnblogs.com/void/archive/2011/08/26/2153928.html

注意:

POJ也是拼,第一次碰到永std的queue会超时,需要手写一个人工栈的情况...

代码:

#include<stdio.h>
#include<algorithm>
#include<queue>
#include<string.h>
using namespace std;
const int inf=0x3f3f3f3f;
struct edge
{
    int id,w;
    edge *next;
};
edge edges[150010];
edge *adj[30005];
bool vis[30005];
int ednum;
int n,m;
int dis[30005];
void SPFA()
{
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++)
    {
        dis[i]=inf;
    }
    dis[1]=0;
    int q[30005];
    int top=0;
    q[++top]=1;
    vis[1]=1;
    while(top)
    {
        int tmp=q[top--];
        vis[tmp]=0;
        for(edge *p=adj[tmp];p;p=p->next)
        {
            if(dis[p->id]>dis[tmp]+p->w)
            {
                dis[p->id]=dis[tmp]+p->w;
                if(!vis[p->id])
                {
                    q[++top]=p->id;
                    vis[p->id]=1;
                }
            }
        }
    }
}
inline void addEdge(int a,int b,int c)
{
    edge *tmp;
    tmp=&edges[ednum];
    ednum++;
    tmp->id=b;
    tmp->w=c;
    tmp->next=adj[a];
    adj[a]=tmp;
}
int main()
{
    int a,b,c;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        addEdge(a,b,c);
    }
    SPFA();
    printf("%d
",dis[n]);
}
原文地址:https://www.cnblogs.com/tun117/p/4851961.html