题意:n个人派发糖果,m组数据包含A,B,C表示B比A糖的数量不会多于C。最后求n比1最多多多少糖。
思路:很明显的差分约束,约束条件为B-A<=C,直接单向A到B建图就可以。由于数据量很大,所以普通的bellman是会超时的,所以需要使用SPFA,据说SPFA用队列也会超时……堆栈即可。
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#define INF 0x3f3f3f3f
#define mod 100000000
using namespace std;
struct node
{
int next, v, w;
} edge[300010*2];
int cnt,n,m;
int dis[31010];
int vis[31010];
int head[151010];
int sta[150100*2];
void SPFA()
{
int u;
int top=0;
for(int i=0;i<=n;i++)
{
dis[i]=INF;
}
memset(vis,0,sizeof(vis));
dis[1]=0;
vis[1]=1;
sta[top++]=1;
while(top>0)
{
u=sta[--top];
vis[u]=0;
for(int i=head[u];i!=-1;i=edge[i].next)
{
if(dis[edge[i].v]>dis[u]+edge[i].w)
{
dis[edge[i].v]=dis[u]+edge[i].w;
if(!vis[edge[i].v]){
vis[edge[i].v]=1;
sta[top++]=edge[i].v;
}
}
}
}
printf("%d\n",dis[n]);
}
int main()
{
int u, v, w;
char c;
while(~scanf("%d%d", &n, &m))
{
memset(head,-1,sizeof(head));
cnt = 0;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt++;
}
SPFA();
}
return 0;
}