题目描述
幼儿园里,有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;
}