poj 3159 Candies

来源:互联网 发布:大数据下的中国 编辑:程序博客网 时间:2024/05/17 08:50

题意:班上有n个同学,现在有一些糖要分给他们,设第i个同学得到的糖为p[i],分糖必须满足条件:第i个同学要求第j个同学的糖不能超过自己k个,即p[j] - p[i] <= k,k >= 0。要求在满足这些条件的情况下,求出p[n] - p[1]的最大值;

最短路问题,就是求有向图最短路,因为假设2比1最多多2个,3比2最多多3个,1比3最多多4个,假如选择1->2->3则3比1最多多5个不符合1比3最多多4个这个条件,因此选择最短路;其实还是请教lsh才明白怎么做用数组建图以及用数组模拟spfa的队列过程;还是太菜- -#

代码:

#include <iostream>#include <stdio.h>#include <string.h>using namespace std;const int maxn=150005;int dis[maxn],vis[maxn],head[maxn];int n,m;struct edgenode{    int to;    int w;    int next;}edge[maxn];int ip;void add(int u,int v,int w){    edge[ip].to=v,edge[ip].w=w,edge[ip].next=head[u],head[u]=ip++;}void spfa(int s){    int u,t;    int q[maxn];    q[t++]=s;    dis[s]=0;    vis[s]=1;    while(t)    {        u=q[--t];        vis[u]=0;        for(int i=head[u];i!=-1;i=edge[i].next)        {            if(dis[edge[i].to]>(dis[u]+edge[i].w))            {                dis[edge[i].to]=(dis[u]+edge[i].w);                if(!vis[edge[i].to])                {                    q[t++]=edge[i].to;                    vis[edge[i].to]=1;                }            }        }    }}int main(){    int a,b,c;    while(scanf("%d%d",&n,&m)!=EOF)    {        memset(vis,0,sizeof(vis));        memset(head,-1,sizeof(head));        ip=1;        for(int i=1;i<=m;i++)        {            scanf("%d%d%d",&a,&b,&c);            add(a,b,c);        }        for(int i=1;i<=n;i++)        dis[i]=99999999;        spfa(1);        printf("%d\n",dis[n]);    }    return 0;}


0 0
原创粉丝点击