题目大意:分糖,a 能忍受分的糖果数 最多比b少c个,给你一系列这些关系,求x能忍受y最多多几个
学习了差分约束系统,了解了不等式<=以及>=对应得最短路最长路得转化,数形结合,也就很简单了,不过这个题有bug啊,正常得spfa中队列过不去,看了题解才知道都没过去哈哈哈,然后学习了模拟栈得用法(注释中),还是很好的~~
#include <iostream> #include <queue> #include <cstdio> #include <string.h> #define inf 0x3f3f3f3f using namespace std; const int maxn = 3e4 + 3e2; const int maxm = 1e5 + 6e4; struct node{ int to,cost; int pre; }edge[maxm]; int id[maxn],cnt; int vis[maxn]; int dis[maxn]; int S[maxn];//模拟栈 void init(int n) { memset(edge,0,sizeof(edge)); memset(id,-1,sizeof(id)); for(int i = 1;i <= n;i++) { vis[i] = 0;dis[i] = inf; } cnt = 0; } void add(int from,int to,int cost) { edge[cnt].to = to; edge[cnt].cost = cost; edge[cnt].pre = id[from]; id[from] = cnt++; } void spfa(int s,int n) { vis[s] = 1,dis[s] = 0; int top = 0;//表示站内元素个数,并且充当索引功能 S[top] = 1; top++; while(top) { int now = S[--top]; vis[now] = 0; for(int i = id[now];~i;i = edge[i].pre) { int to = edge[i].to; int cost = edge[i].cost; if(dis[to] > dis[now] + cost) { dis[to] = dis[now] + cost; if(!vis[to]) { vis[to] = 1; S[top++] = to; } } } } } int main() { int n,m,a,b,x; while(~scanf("%d%d",&n,&m)) { init(n); while(m--) { scanf("%d%d%d",&a,&b,&x); add(a,b,x); } spfa(1,n); printf("%d ",dis[n]); } return 0; }
感慨一下:原理非常可怕的spfa以及链式前向星,现在觉得和并查集基础dfsbfs差不多了,感觉信手什么来了~~,熟能生巧,多练多炼多恋吧~~