题意:
flymouse是幼稚园班上的班长,一天老师给小朋友们买了一堆的糖果,由flymouse来分发。flymouse希望自己分得的糖果数尽量多于snoopy。对于其他小朋友而言,则必须自己得到的糖果不少于班上某某,给出m个这种约束关系(u,v, w)即同学u的糖果数不能比同学v的糖果数少w。问flymouse最多能多snoopy几个糖果。
差分约束问题;
注意:
1,注意用vis标记已经走过的,要不然会re。
2,注意路径的加入
差分约束条件:
1,a b c b-a<=c;
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stack>
#include<algorithm>
#define INF 1000000000
using namespace std;
struct list
{
int next;
int r;
int len;
}node[150001];
int dist[30001];
int head[30001];
int vis[30001];
int n,m;
int num;
void add(int a,int b,int c)
{
node[num].next=head[a];
node[num].r=b;
node[num].len=c;
head[a]=num++;
}
int spfa()
{
int i;
stack<int>q;
for(i=1;i<=n;i++)
dist[i]=INF;
q.push(1);
dist[1]=0;
vis[1]=1;
while(!q.empty())
{
int e;
e=q.top();
q.pop();
vis[e]=0;
for(i=head[e];i;i=node[i].next)
{
if(dist[node[i].r]>dist[e]+node[i].len)
{
dist[node[i].r]=dist[e]+node[i].len;
if(!vis[node[i].r])
{
vis[node[i].r]=1;
q.push(node[i].r);
}
}
}
}
return dist[n];
}
int main()
{
int i,a,b,c;
scanf("%d%d",&n,&m);
memset(head,0,sizeof(head));
num=1;
for(i=0;i<m;i++)
{
scanf("%d %d %d",&a,&b,&c);
add(a,b,c);
}
printf("%d\n",spfa());
return 0;
}