题意:其实题目要求的就是这个B-A<=c,所以对应单源最短路径中的d[v]>d[u]+e[u][v]
关于差分约束:
当问题可以转化为形如一组 xi‑x’i<=yi 或一组 xi‑x’i>=yi ,求任一满足的可行解的问题时,可以将其转化为最短路/最长路问题。

注意:求的是两个变量差的最大值,那么需要将所有不等式转变成"<=“的形 式,建图后求最短路;相反,如果需要求的是两个变量差的最小值,那么需要将所有不等式转化成”>=",建图后求最长路。

方法一超时:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<cstdio>
using namespace std;
const int maxx=30005;
struct node{int u,v;int next;int w;
}e[maxx<<2];
const int inf=0x3f3f3f3f;
int dist[maxx];
int vis[maxx];
int num[maxx];
int n,m,k;
int head[maxx];
vector<int>G[maxx];
int cnt;
queue<int>q;
void init(){cnt=0;memset(dist,inf,sizeof(dist));memset(num,0,sizeof(num));memset(vis,0,sizeof(vis));memset(head,-1,sizeof(head));while(!q.empty())q.pop();for(int i=0;i<=n;i++){G[i].clear();}
}
void add(int u,int v,int w){e[cnt].u=u;e[cnt].v=v;e[cnt].w=w;e[cnt].next=head[u];head[u]=cnt++;
}
void SPFA(int s,int t){dist[s]=0;vis[s]=1;q.push(s);while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=head[u];i!=-1;i=e[i].next){int v=e[i].v;if(dist[v]>dist[u]+e[i].w){dist[v]=dist[u]+e[i].w;if(vis[v]==0){q.push(v);vis[v]=1;}}}}
}
int main(){while(scanf("%d %d",&n,&m)!=EOF){init();for(int i=1;i<=m;i++){int a,b;int cost;scanf("%d %d %d",&a,&b,&cost);add(a,b,cost);}SPFA(1,n);cout<<dist[n]<<endl;}return 0;
}
方法二:-Accept
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<cstdio>
using namespace std;
const int maxx=30005;
struct edge{int u,v;int w;edge(int v,int w):v(v),w(w){}bool operator<(const edge a)const{return w>a.w;}
};
struct node{int u,v;int next;int w;
}e[maxx<<2];
const int inf=0x3f3f3f3f;
int dist[maxx];
int vis[maxx];
int num[maxx];
int n,m,k;
int head[maxx];
vector<int>G[maxx];
int cnt;
priority_queue<edge>q;
void init(){cnt=0;memset(dist,inf,sizeof(dist));memset(num,0,sizeof(num));memset(vis,0,sizeof(vis));memset(head,-1,sizeof(head));while(!q.empty())q.pop();for(int i=0;i<=n;i++){G[i].clear();}
}
void add(int u,int v,int w){e[cnt].u=u;e[cnt].v=v;e[cnt].w=w;e[cnt].next=head[u];head[u]=cnt++;
}
void Dijkstra(int s){dist[s]=0;q.push(edge(s,0));while(!q.empty()){edge u=q.top();q.pop();int v=u.v;if(vis[v])continue;vis[v]=1;for(int j=head[v];j!=-1;j=e[j].next){int t=e[j].v;if(!vis[t]&&dist[t]>dist[v]+e[j].w){dist[t]=dist[v]+e[j].w;q.push(edge(t,dist[t]));}}}
}
int main(){while(scanf("%d %d",&n,&m)!=EOF){init();for(int i=1;i<=m;i++){int a,b;int cost;scanf("%d %d %d",&a,&b,&cost);add(a,b,cost);}Dijkstra(1);cout<<dist[n]<<endl;}return 0;
}

poj3159(差分约束)相关推荐

  1. poj3159差分约束+栈实现的spfa+邻接链表

    题意:班长派糖果,一共有n个人,有m个关系,每个关系输入如 a b v,代表a希望自己的糖果不会比b少v个,又由于班长很痛恨编号为1的同学,希望尽量比他多尽量多得糖果,求最多可以多多少(班长的编号是n ...

  2. 【差分约束】POJ3159/LG P1993 小K的农场

    终于把差分约束刷完了!!,这些题的套路都是很类似的 题目描述小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种 ...

  3. POJ3159 Candies 差分约束

    一.内容 During the kindergarten days, flymouse was the monitor of his class. Occasionally the head-teac ...

  4. HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集

    题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...

  5. HDU3440(差分约束+SPFA算法)

    题意:两栋房子之间的最大距离为D,也就是A-B<=D,现在求出最矮和最高房子之间的最大距离 思路:差分约束+SPFA算法: 当问题可以转化为形如一组 xi‑x'i<=yi 或一组 xi‑x ...

  6. HDU1531(差分约束+Bellman_ford)

    题意:给出一个序列Si = {aSi, aSi+1, ..., aSi+ni} 和其子序列S = {a1, a2, ..., an}:在给出序列的约束条件: aSi + aSi+1 + ... + a ...

  7. poj1364(差分约束+Bellman-ford)

    题意:给出一个序列Si = {aSi, aSi+1, ..., aSi+ni} 和其子序列S = {a1, a2, ..., an}:在给出序列的约束条件: aSi + aSi+1 + ... + a ...

  8. poj1201(差分约束+SPFA)

    看到这道题,其实就是和poj1716是差不多的 题意:给出n个闭整数区间[ai,bi]和n个整数C1,.,cn.计算具有区间[ai,bi]的至少ci公共元素的整数集Z的最小大小,对于每一个i=1,2, ...

  9. poj3169(差分约束+SPFA)

    题意:FJ有N头牛,这些牛都站在一条直线上等待,但是现在给出了一些条件: 1.首先列出哪些牛之间彼此喜欢,以及之间的最大距离,也就是A-B<=X 2.随后列出哪些牛之间彼此不喜欢,以及之间的最小 ...

最新文章

  1. R语言ggplot2可视化分面图(faceting)、并设置每一个分面中的条形图都是排序的(bars are in order in each per facet of facet_warp)
  2. python中的一些算法
  3. python使用curses库获取控制台的键盘输入(如上下左右)
  4. Redis中的可用性保证之Sentinel服务下线
  5. 我的世界JAVA刷怪范围_《我的世界》只有刷怪蛋能够刷新生物吗?并不是,还有一种物品!...
  6. python库Camelot从pdf抽取表格数据以及python库camelot安装及使用中的一些注意事项
  7. CString类常用方法(转载)
  8. 设p他主修计算机科学,华南农业大学 离散数学 期末考试2013试卷及答案
  9. Jquery获得服务器控件的方法
  10. 软件测试思想者 - 软件评测师考试顺利通关
  11. 一个真实的Windows XP SP 3镜像包 571MB大小
  12. 安卓的权限大全和动态使用安卓权限
  13. UTF-8编码转中文解码
  14. python pandas excle 把两列合并新的一列
  15. iText7解套(二)中文行首行末标点符号处理
  16. 移动端h5图片下载-前端小白初长成
  17. 【GlobalMapper精品教程】033:影像地图羽化方式详解
  18. 从零开始学C语言之第一节
  19. title: hexo博客搭建流程(附gitee仓库同步等)
  20. [java]飞书机器人签名校验GenSign方法

热门文章

  1. Java程序流程控制(顺序结构、分支结构、循环结构、if-else、switch-case、for、while、do-while、break、continue、return)
  2. 美多商城之支付(评价订单商品)
  3. python线程的注意点(线程之间执行是无序的、主线程会等待所有的子线程执行结束再结束(守护主线程)、线程之间共享全局变量、线程之间共享全局变量数据出现错误问题(线程等待(join)、互斥锁))
  4. MySQL数据库中as和distinct关键字
  5. Selenium之运行效果展示
  6. 虚拟机VMware14安装kali-linux-2019.1-amd64
  7. 【Python基础】Python的深浅拷贝讲解
  8. OpenCV4.4 CUDA编译与加速全解析
  9. 手把手用YOLO做目标检测
  10. 【转】DHCP工作过程详解