poj-3159-Candies-差分约束+stack

来源:互联网 发布:php仓库管理mysql 编辑:程序博客网 时间:2024/05/22 17:02

题意:

flymouse是幼稚园班上的班长,一天老师给小朋友们买了一堆的糖果,由flymouse来分发。flymouse希望自己分得的糖果数尽量多于snoopy。对于其他小朋友而言,则必须自己得到的糖果不少于班上某某,给出m个这种约束关系(u,v, w)即同学u的糖果数不能比同学v的糖果数少w。问flymouse最多能多snoopy几个糖果。

差分约束问题;

注意:

1,注意用vis标记已经走过的,要不然会re。

2,注意路径的加入

差分约束条件:

1,a b c   b-a<=c;

#include<iostream>#include<stdio.h>#include<string.h>#include<stack>#include<algorithm>#define INF 1000000000using namespace std;struct list{    int next;    int r;    int len;}node[150001];int dist[30001];int head[30001];int vis[30001];int n,m;int num;void add(int a,int b,int c){    node[num].next=head[a];    node[num].r=b;    node[num].len=c;    head[a]=num++;}int spfa(){    int i;    stack<int>q;    for(i=1;i<=n;i++)    dist[i]=INF;    q.push(1);    dist[1]=0;    vis[1]=1;    while(!q.empty())    {        int e;        e=q.top();        q.pop();        vis[e]=0;        for(i=head[e];i;i=node[i].next)        {            if(dist[node[i].r]>dist[e]+node[i].len)            {                dist[node[i].r]=dist[e]+node[i].len;                if(!vis[node[i].r])                {                    vis[node[i].r]=1;                    q.push(node[i].r);                }            }        }    }    return dist[n];}int main(){    int i,a,b,c;    scanf("%d%d",&n,&m);    memset(head,0,sizeof(head));    num=1;    for(i=0;i<m;i++)    {        scanf("%d %d %d",&a,&b,&c);        add(a,b,c);    }    printf("%d\n",spfa());    return 0;}


原创粉丝点击