题意:n个人分糖果,问题是怎么分才能使第一个人和最后一个人相差最多。条件限制是有m个第a不能低于第b人c个。
于是a+c >= b,则可以得到b < a + c.在图中可以认为a->b的权值是c。如果dis[a]+c < dis[b],就松弛。
题中数据过多。则用spfa,并且需要数组模拟queue。
#include<cstdio>
#include<iostream>
#include<cstring>
#define inf 0x3f3f3f3f
#define maxn 30005
using namespace std;
class Node
{
public:
int e,v;
int next;
}edge[150005];
int n,m;
int head[maxn];
int dis[maxn];
int visit[maxn];
int Q[maxn];
int pos = 0;
void spfa()
{
pos = 0;
memset(dis,inf,sizeof(dis));
memset(visit,0,sizeof(visit));
Q[pos++] = 1;
visit[1] = true;
dis[1] = 0;
while(pos != 0){
int u = Q[--pos];
visit[u] = false;
for(int i = head[u];i != -1; i = edge[i].next){
int to = edge[i].e;
if(dis[to] < dis[u] + edge[i].v)
continue;
dis[to] = dis[u] + edge[i].v;
if(!visit[to]){
Q[pos++] = to;
visit[to] = true;
}
}
}
}
int main()
{
// freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head));
int a,b,c;
for(int i = 1;i <= m; i++){
scanf("%d%d%d",&a,&b,&c);
edge[i].e = b;
edge[i].v = c;
edge[i].next = head[a];
head[a] = i;
}
spfa();
printf("%d\n",dis[n]);
return 0;
}