幼儿园分糖果

题目描述
幼儿园里,有n个小朋友,编号1到n,罗老师在给他们分糖果。分的时候,很多小朋友提出了要求(这年头,小朋友就敢提要求。。。),罗老师就说,如果最近一周你们都表现很好,就答应你们的要求。

结果一周过去了,小朋友们纪律良好,成绩优秀,各方面都很出色。于是罗老师得按他们的要求分糖果了。

小朋友总共有m个要求, 每个要求如下:

x y z

表示编号y的小朋友不能比编号x的小朋友糖果数量多超过z颗(也就是y最多比x多z颗)

当然罗老师自己也有个要求,他希望编号n的小朋友比编号1的小朋友糖果多很多。在满足小朋友们所有要求的前提下,问编号为n的小朋友糖果数量最多可以比编号为1小朋友糖果数量多多少?

输入
第一行输入n, m

接下来m行,每行输入x y z,如题中描述的意思

输出
输出最多可以多多少, 如果可以无限多,输出”infinite”; 否则输出答案

样例输入
2 2
1 2 5
2 1 4
样例输出
5
提示
【样例说明】

样例2:

3 2

1 2 5

3 2 4

输出:

infinite

【数据规模和约定】

1<= n <= 30000 1<=m<=650000

1<=x, y<=n (x和y不会相等) 0<=z<=100000

题解
y-x<=z
求最大值,用小于号,求最短路。x->y(z)

代码

#include<bits/stdc++.h>
#define ll long long
#define pa pair<long long,int>
using namespace std;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
    while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
bool vis[30005];
int tot,n,m;
ll dis[30005];
int head[30005],Next[650005],ret[650005],len[650005];
void ins(int u,int v,int l)
{
    ret[++tot]=v;len[tot]=l;
    Next[tot]=head[u];head[u]=tot;
}
struct node{ll d;int u;}t;
struct cmp{
    bool operator()(node a,node b)
    {
        return a.d>b.d;
    }
};
void dijkstra()
{
    for (int i=1;i<=n;i++) dis[i]=3000000005LL,vis[i]=0;
    priority_queue<node,vector<node>,cmp>q;
    t.d=0LL;t.u=1;
    q.push(t);dis[1]=0LL;
    while (!q.empty())
    {
        int now=q.top().u;q.pop();
        if (vis[now]) continue;
        vis[now]=1;
        for (int i=head[now];i;i=Next[i])
        {
            if (!vis[ret[i]]&&dis[ret[i]]>dis[now]+(ll)len[i])
            {
                dis[ret[i]]=dis[now]+(ll)len[i];
                t.d=dis[ret[i]];t.u=ret[i];
                q.push(t);
            }
        }
    }
    if (dis[n]==3000000005LL) printf("infinite");
    else printf("%lld",dis[n]);
}
int main()
{
    n=read();m=read();int x,y,z;
    for (int i=1;i<=m;i++)
    {
        x=read();y=read();z=read();
        ins(x,y,z);
    }
    dijkstra();
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值