版权声明: https://blog.csdn.net/weixin_40959045/article/details/79449426
第一道差分约束
题意:熊孩纸系列…………
A认为B不会比他多c颗糖及
candies[B] <= candies[A] + C
与d[v] <= d[u] + e.cost 类似
#include <iostream>
#include <vector>
#include <stack>
#include <cstring>
#include <cstdio>
using namespace std;
#define INF 1<<30
#define MAX_V 50000
#define MAX_E 300000
struct edge{
int v;
int cost;
int next;
};
struct edge es[MAX_E];
int head[MAX_V];
int len = 0;
void add(int from,int to,int val)
{
es[len].v=to;
es[len].cost =val;
es[len].next = head[from];
head[from]=len++;
}
int V;
bool inqueue[MAX_V];
int d[MAX_V];
void spfa(int s){
for (int i = 0;i<=V;i++)
d[i] = INF;
memset(inqueue,0,sizeof inqueue);
d[s] = 0; inqueue[s] = true;
stack<int> Q;
Q.push(s);
while (!Q.empty()){
int u = Q.top(); Q.pop();
inqueue[u] = false;
for (int i = head[u];i != -1;i = es[i].next){
int v = es[i].v;
if (d[v] > d[u] + es[i].cost){
d[v] = d[u] + es[i].cost;
if (!inqueue[v]){
Q.push(v);
inqueue[v] = true;
}
}
}
}
}
void init(){
int M;
scanf("%d%d",&V,&M);
memset(head,-1,sizeof head);
for (int i = 0;i<M;i++){
int from,to,val;
scanf("%d%d%d",&from,&to,&val);
add(from,to,val);
}
}
int main()
{
init();
spfa(1);
printf("%d\n",d[V]);
return 0;
}