UVA - 11478 Halum 二分+差分约束
题目链接:
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34651
题意:
给定一个有向图,每一条边都有一个权值,每次你可以选择一个节点v和一个整数d,把所有以v结尾的边权值减小d,把所有以v为起点的边的权值增加d,最后要让所有边权的最小值大于0且尽量大。
题解:
最小值最大,可以用二分,这样可以得到一个差分约束系统,然后每次都用最短路跑。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<queue> #include<algorithm> using namespace std;const int maxn = 555; const int maxm = 2777;struct Edge {int v, w;Edge(int v, int w) :v(v), w(w) {}Edge() {} };vector<Edge> egs; vector<int> G[maxn]; int tot = 0; int n, m;void addEdge(int u, int v, int w) {egs.push_back(Edge(v, w));tot = egs.size();G[u].push_back(tot - 1); }bool inq[maxn]; int d[maxn]; int cnt[maxn]; bool spfa(int x) {bool ret = true;for (int i = 1; i < n; i++) {for (int j = 0; j < G[i].size(); j++) {Edge& e = egs[G[i][j]];e.w -= x;}}memset(inq, 0, sizeof(inq));memset(cnt, 0, sizeof(cnt));memset(d, 0x3f, sizeof(d));queue<int> Q;d[0] = 0; inq[0] = true; Q.push(0);while (!Q.empty()) {int u = Q.front(); Q.pop();inq[u] = false;for (int i = 0; i < G[u].size(); i++) {Edge& e = egs[G[u][i]];if (d[e.v] > d[u] + e.w) {d[e.v] = d[u] + e.w;if (!inq[e.v]) {Q.push(e.v); inq[e.v] = true;if (++cnt[e.v] > n) {ret = false; break;}}}}if (ret == false) break;//printf("u:%d\nx:%d\n", u,x);//printf("in circle\n"); }for (int i = 1; i < n; i++) {for (int j = 0; j < G[i].size(); j++) {Edge& e = egs[G[i][j]];e.w += x;}}return ret; }void init() {for (int i = 0; i < n; i++) G[i].clear();egs.clear(); }int main() {while (scanf("%d%d", &n, &m) == 2 && n) {n++;init();int l = 1, r = -1;for (int i = 0; i < m; i++) {int u, v, w;scanf("%d%d%d", &u, &v, &w);r = max(r, w);addEdge(u, v, w);}for (int i = 1; i < n; i++) {addEdge(0, i, 0);}r++;if (!spfa(1)) {printf("No Solution\n");}else if (spfa(r)) {printf("Infinite\n");}else {while (l + 1 < r) {int mid = l + (r - l) / 2;if (spfa(mid)) l = mid;else r = mid;//printf("here!\n"); }printf("%d\n", l);}}return 0; }/* 1 2 10 1 2 -10 3 2 4 3 2 1 5 5 3 4 2 5 4 2 1 0 2 -1 */
转载于:https://www.cnblogs.com/fenice/p/5532549.html
UVA - 11478 Halum 二分+差分约束相关推荐
- UVA 11478 Halum(用bellman-ford解差分约束)
对于一个有向带权图,进行一种操作(v,d),对以点v为终点的边的权值-d,对以点v为起点的边的权值+d.现在给出一个有向带权图,为能否经过一系列的(v,d)操作使图上的每一条边的权值为正,若能,求最小 ...
- 差分约束问题 ---- 2019ccpc哈尔滨A. Artful Paintings[二分+差分约束+建图剪枝]
题目链接 题目大意: 有N≤3e3N≤3e3N≤3e3个格子,你可以任意给每个格子染色,但是要满足M≤3e3M≤3e3M≤3e3限制条件,限制条件有两种类型: 区间[l,r][l,r][l,r]中被染 ...
- UVA 11478 Halum (差分约束)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- Luogu4926 倍杀测量者(二分答案+差分约束)
容易想到二分答案.问题变为判断是否所有条件都被满足,可以发现这是很多变量间的相对关系,取个log之后就是经典的差分约束模型了.特殊的地方在于某些人的分数已被给定,从每个人开始跑一遍最短路判断一下是否能 ...
- hdu1529 差分约束(好题)
题意: 超市在每个时间都有需要的人数(24小时)比如 1 0 0 0 0 ....也就是说在第0个小时的时候要用一个人,其他的时间都不用人,在给你一些人工作的起始时间,如果雇佣了这个人,那 ...
- LOJ:出纳员问题(差分约束)
解析 毒瘤题 思路的关键是利用前缀和建图,枚举sum[24]点值 (其实可以二分) 主要是细节的处理不够清晰 使下标从1开始会一下子好做起来 然后把0当做源点 差分约束一定要有源点!! 代码 #inc ...
- 【POJ - 1275】Cashier Employment(差分约束,建图)
题干: A supermarket in Tehran is open 24 hours a day every day and needs a number of cashiers to fit i ...
- HDU 4598 Difference 差分约束 + 判奇圈
题意:给你一个无向图 这个图是difference的如果存在一个正实数T使得图中所有的点的绝对值|ai|<T 并且点i j构成一条边当且仅当|ai-aj|>=T 问你是否存在一个这样的图 ...
- [差分约束] AcWing-393 雇佣收银员 AcWing-2128 狡猾的商人 AcWing-3265 再卖菜
差分约束的大概样子 (大概) 差分约束一般是由特殊的n元一次不等式组组成的,它包含N个变量X1-Xn和M个约束条件,而且每个约束条件都是由两个变量做差组成的,形如,其中的ck是常数,它需要我们找到一组 ...
最新文章
- 如何将某个groupbox中的数据赋值到另一个groupbox_React中的数据和数据流
- 手动修改Win7开机欢迎界面背景图片
- 如何成为一名优秀的程序员?
- 教育部:到2020年全面普及实名制网络学习空间
- Android应用开发(1)---Android五大UI布局的特有属性
- Netty工作笔记0011---Channel应用案例2
- GIT与SVN世纪大战
- 最新ECSHOP解闷商城系统+休闲娱乐EC购物商城源码
- java架构师证书_java架构师证书怎么考?做架构师有什么要求?
- 一些实用型的工具及网站
- 新型智慧城市顶层规划与设计方案
- 用JAVA编程的数字时钟代码
- 关于“父虚拟磁盘在子虚拟磁盘创建之后被修改过。……打不开磁盘啥啥啥”的解决方法
- 手机抓包软件:charles安装及教程
- deepin20 外接显示器,标题栏美化
- 企业业务的 WPA3 安全性为啥如此重要?
- 24L01配置函数详解
- 计算机三级网络技术最全知识点总结三
- 循环冗余校验码CRC原理和实例
- 新闻客户端的三种模式和四种活法