您的位置:首页 > 其它

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

2013-03-11 21:00 369 查看
题意:

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 1000000000
using 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
;
}
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: