POJ3169 Layout (差分约束系统)
2015-08-11 21:36
447 查看
传送门
题意:有N头牛,第i头牛一定在第i-1头和第i+1头中间(按照编号从小到大排列)给出两种约束
1. A 到 B 的距离不少于 D
2. A 到 B 的距离不超过 D
要求第N头到第一头的距离最远。若无解,输出-1,若无限远,输出-2.
用dis(i)表示从第一头牛到第i头牛的距离,所以
-对于条件1有:dis(A) + D >= dis(B) 连一条从A到B的有向边权值为D(因为最大为D……)
-对于条件2有:dis(A) + D <= dis(B),变形为dis(B) - D >= dis(A),连一条从B到A的有向边权值为-D
又因为i+1要在i的后面,所以有dis(i+1) + 0 >= dis(i),连一条从i+1到i的等于0的边
题意:有N头牛,第i头牛一定在第i-1头和第i+1头中间(按照编号从小到大排列)给出两种约束
1. A 到 B 的距离不少于 D
2. A 到 B 的距离不超过 D
要求第N头到第一头的距离最远。若无解,输出-1,若无限远,输出-2.
用dis(i)表示从第一头牛到第i头牛的距离,所以
-对于条件1有:dis(A) + D >= dis(B) 连一条从A到B的有向边权值为D(因为最大为D……)
-对于条件2有:dis(A) + D <= dis(B),变形为dis(B) - D >= dis(A),连一条从B到A的有向边权值为-D
又因为i+1要在i的后面,所以有dis(i+1) + 0 >= dis(i),连一条从i+1到i的等于0的边
#include<queue> #include<cstdio> #include<iostream> #include<cstring> using namespace std; const int MAXN = 1005; const int MAXM = 20005; struct node { int v, w; node *next; }Edge[MAXM*2], *Adj[MAXN], *Mcnt = Edge; void Addedge(int u,int v,int w) { node *t = ++Mcnt; t->v = v; t->w = w; t->next = Adj[u]; Adj[u] = t; } int n, ml, md, dis[MAXN], cnt, vis[MAXN]; bool inq[MAXN]; bool spfa(int s) { memset(dis, 0x3f, sizeof dis); memset(vis, 0, sizeof vis); memset(inq, 0, sizeof inq); dis[s] = 0; inq[s] = vis[s] = 1; queue<int> q; q.push(s); while(!q.empty()) { int u = q.front(); q.pop(); inq[u] = 0; for(node *p = Adj[u]; p; p = p->next) { int v = p->v; if(dis[u] + p->w < dis[v]) { dis[v] = dis[u] + p->w; if(!inq[v]) { q.push(v); ++ vis[v]; inq[v] = 1; if(vis[v] > 6)return 1; } } } } return 0; } int main() { cin>>n>>ml>>md; int a, b, d; for(int i = 1; i <= ml; i ++) { cin>>a>>b>>d; Addedge(a, b, d); } for(int i = 1; i <= md; i ++) { cin>>a>>b>>d; Addedge(b, a, -d); } for(int i = 1; i <= n-1; i ++) Addedge(i + 1, i, 0); if(spfa(1)) printf("-1\n"); else if(dis != 0x3f3f3f3f) printf("%d\n", dis ); else printf("-2"); return 0; }
相关文章推荐
- AnimationDrawable OOM
- 我的iOS开发之Objective-C第8天之延展和协议以及深浅复制
- POJ 2513 Colored Sticks (Tire+欧拉路+并查集)
- Struts2多文件的上传
- hdu5372 Segment Game
- hdu 1671 Phone List(给定n个电话号码串,问这n个电话号码串中是否存在某一串是其它串的前缀,如果存在输出NO,否则YES)
- NOIP2011-普及组复赛模拟试题-第一题-NBA总冠军
- 【C语言】32位,64位机器sizeof区别
- 【机器学习系列】机器学习界大牛林达华推荐的书籍
- 黑马程序员——封装
- @property的用法
- hdu 2001 计算两点间的距离
- MyBatis -- sql映射文件详解
- HDU 4593 H - Robot 水题
- 【bzoj1208】[HNOI2004]宠物收养所
- Lotto
- hdoj 1875 畅通工程再续 【最小生成树】
- Eclipse连接天天模拟器进行调试
- 田忌赛马
- 1007 奥运排序问题