poj 3159 Candies (差分约束)
2015-09-06 09:45
603 查看
一个叫差分约束系统的东西。如果每个点定义一个顶标x(v),x(t)-x(s)将对应着s-t的最短路径。
比如说w+a≤b,那么可以画一条a到b的有向边,权值为w,同样地给出b+w2≤c,a+w3≤c。那么a到c的最大差就受这些不等式约束,对应着图中的最短路。
这个边多,不要用vector存,满了以后重新复制数据,会T的,没试过指定大小。。。
比如说w+a≤b,那么可以画一条a到b的有向边,权值为w,同样地给出b+w2≤c,a+w3≤c。那么a到c的最大差就受这些不等式约束,对应着图中的最短路。
这个边多,不要用vector存,满了以后重新复制数据,会T的,没试过指定大小。。。
#include<iostream> #include<cstdio> #include<vector> #include<cstring> #include<queue> using namespace std; //POJ 是个坑 const int maxn = 3e4+1; const int maxm = 15e4+5; struct Edge { int v,w,nxt; //Edge(int v = 0,int w = 0):v(v), w(w){} }edges[maxm]; int ecnt,head[maxn]; typedef pair<int,int> Node; #define fi first #define se second void addEdge(int u,int v,int w) { edges[++ecnt].v = v; edges[ecnt].w = w; edges[ecnt].nxt = head[u]; head[u] = ecnt; } int d[maxn]; const int INF = 0x7f7f7f7f; int dijkstra(int s, int t) { priority_queue<Node,vector<Node>,greater<Node> > q; memset(d,0x7f,sizeof(d)); q.push(Node(d[s] = 0,s)); while(q.size()){ Node x = q.top(); q.pop(); int u = x.se; if(u == t) return d[t]; if(x.fi != d[u]) continue; for(int i = head[u]; i; i = edges[i].nxt){ Edge &e = edges[i]; if(d[e.v] - d[u] > e.w){ d[e.v] = d[u] + e.w; q.push(Node(d[e.v],e.v)); } } } return INF; } int main() { //freopen("in.txt","r",stdin); int n,m; cin>>n>>m; while(m--){ int u,v,w; scanf("%d%d%d",&u,&v,&w); addEdge(u-1,v-1,w); } printf("%d\n",dijkstra(0,n-1)); return 0; }
相关文章推荐
- 微服务架构的设计模式
- Java的进程内缓存框架:EhCache
- 反渗透设备:反渗透水处理设备应用广泛
- Struts2笔记――15.Spring的事务
- flume-ng收集windows日志笔记
- monkey学习笔记(二)
- 广泛结交而谨慎择友
- perl 中的$/
- tomcat绿色版及安装版修改内存大小的方法
- jquery基础知识实例(一)
- 图书馆Demo完成后总结
- view透明度渐变
- 反渗透设备:反渗透纯净水处理设备特点
- hdu 5430 Reflect(欧拉函数)
- R语言_Simulation
- Android createWindowSurface failed EGL_BAD_ALLOC 引起Crash的解决方案
- I2S与pcm的区别
- JqueryMobile动态生成listView并实现刷新的两种方法
- [转]为什么GOF的23种设计模式里面没有MVC?
- asp.net常用的两个验证控件