题目大意:
n个小孩,m个关系
A B c : 表示小孩A认为小孩B的糖果不能比自己多c个
方法:
这道题考察的是差分约束
首先建立不等关系
Dis[b] - Dis[a] <= c
将每个关系看成是有向图的一条边,SPFA求最短路
注意:SPFA+队列会超时(其实我是WA), 但是用SPFA+堆栈就莫名其妙的AC了
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#pragma comment(linker, "/STACK:1024000000")
#define LL long long
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
const double eqs=1e-9;
const int MAXN=150010;
struct node
{
int v,w,next;
} Edge[MAXN*3];
int Dis[MAXN*3],head[MAXN*2],vis[MAXN*3],top;
int que[MAXN*3];
void Add(int u,int v,int w)
{
Edge[top].v = v;
Edge[top].w = w;
Edge[top].next = head[u];
head[u] = top++;
}
void SPFA(int n)
{
int s = 0;
int e = 0;
for(int i=1; i<=n; i++)
{
Dis[i] = INF;
vis[i] = false;
}
Dis[1] = 0;
vis[1] = true;
que[++s] = 1;
while(s)
{
int u = que[s--];
vis[u] = false;
for(int i=head[u]; i!=-1; i=Edge[i].next)
{
int w = Edge[i].w;
int v = Edge[i].v;
if(Dis[v] > Dis[u] + w)
{
Dis[v] = Dis[u] + w;
if(!vis[v])
{
vis[v] = true;
que[++s] = v;
}
}
}
}
}
int main()
{
int n,m,u,v,w;
while(~scanf("%d%d",&n,&m))
{
memset(head, -1, sizeof(head));
top = 0;
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
Add(u,v,w);
}
for(int i=1;i<=n;i++)
Add(0,i,0);
SPFA(n);
printf("%d\n",Dis[n]);
}
return 0;
}