UVA-11478 Halum【二分】【差分约束】
题目大意
给你一个n个点,m条边的有向图
有一种操作把所有到达这个点的边全部减小d,把所有从从这个点出发的边加上d
问最后是否可以让所有边的边权最小值最大
如果可以无限大,输出\(Infinite\),如果不能让所有边权非负,输出\(No\ solution\)
思路
最小值最大
就可以考虑二分了
然后发现对于任意一个点
所有在这个点上的操作是可以累加起来的,这样我们就可以令\(c_u\)表示在u这个节点上的操作值的总和
那么对于一条有向边\((u,v)\),边权是\(mid\le w_{u,v}+c_u-c_v\)
转换成\(c_v-c_u\le w_{u,v}-mid\)
就把\(v\)到\(u\)连上长度是\(w_{u,v}-mid\)的边
然后深搜spfa判断负环就可以啦
为啥不广搜?
广搜1000ms深搜10ms你选哪一个?
在实际实现中其实发现c的正负没有影响
所以咋推式子都行我写代码和写题解推的式子都不一样
//Author: dream_maker
#include<bits/stdc++.h>
using namespace std;
//----------------------------------------------
//typename
typedef long long ll;
//convenient for
#define fu(a, b, c) for (int a = b; a <= c; ++a)
#define fd(a, b, c) for (int a = b; a >= c; --a)
#define fv(a, b) for (int a = 0; a < (signed)b.size(); ++a)
//inf of different typename
const int INF_of_int = 1e9;
const ll INF_of_ll = 1e18;
//fast read and write
template <typename T>
void Read(T &x) {
bool w = 1;x = 0;
char c = getchar();
while (!isdigit(c) && c != '-') c = getchar();
if (c == '-') w = 0, c = getchar();
while (isdigit(c)) {
x = (x<<1) + (x<<3) + c -'0';
c = getchar();
}
if (!w) x = -x;
}
template <typename T>
void Write(T x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) Write(x / 10);
putchar(x % 10 + '0');
}
//----------------------------------------------
const int N = 1e5 + 10;
struct Edge {
int v, w, nxt;
} E[N];
int fro[N], to[N], val[N];
int dis[N], inq[N];
int head[N], tot, n, m;
void add(int u, int v, int w) {
E[++tot] = (Edge) {v, w, head[u]};
head[u] = tot;
}
void init() {
fu(i, 1, n) dis[i] = INF_of_int;
fu(i, 1, n) head[i] = inq[i] = 0;
tot = 0;
}
bool spfa(int u) {
inq[u] = 1;
for (int i = head[u]; i; i = E[i].nxt) {
int v = E[i].v;
if (dis[v] > dis[u] + E[i].w) {
dis[v] = dis[u] + E[i].w;
if (inq[v] || (!inq[v] && !spfa(v))) return 0;
}
}
inq[u] = 0;
return 1;
}
/*
bool spfa() {
static queue<int> q;
fu(i, 1, n) inq[i] = 1, q.push(i);
while (q.size()) {
int u = q.front(); q.pop();
inq[u] = 0;
for (int i = head[u]; i; i = E[i].nxt) {
int v = E[i].v;
if (dis[v] > dis[u] + E[i].w) {
dis[v] = dis[u] + E[i].w;
if (!inq[v]) {
if (++vis[v] >= n) return 0;
else inq[v] = 1, q.push(v);
}
}
}
}
return 1;
}
*/
bool check(int key) {
init();
fu(i, 1, m)
add(to[i], fro[i], val[i] - key);
fu(i, 1, n) if (!spfa(i)) return 0;
return 1;
}
void work() {
int l = 1, r = 1;
fu(i, 1, m) {
Read(fro[i]), Read(to[i]), Read(val[i]);
r = max(r, val[i]);
}
if (check(r)) {printf("Infinite\n");}
else if (!check(l)) {printf("No Solution\n");}
else {
int res = 1;
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) l = mid + 1, res = mid;
else r = mid - 1;
}
Write(res), putchar('\n');
}
}
int main() {
#ifdef dream_maker
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
while (scanf("%d %d", &n, &m) != EOF) work();
}
UVA-11478 Halum【二分】【差分约束】的更多相关文章
- UVA - 11478 Halum 二分+差分约束
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34651 题意: 给定一个有向图,每一条边都有一个权值,每次你可以 ...
- UVA 11478 Halum(差分约束)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34651 [思路] 差分约束系统. 设结点u上的操作和为sum[u] ...
- 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束)
layout: post title: 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束) author: "luowentaoaa" catal ...
- UVA - 11478 - Halum(二分+差分约束系统)
Problem UVA - 11478 - Halum Time Limit: 3000 mSec Problem Description You are given a directed grap ...
- UVA 11478 Halum(用bellman-ford解差分约束)
对于一个有向带权图,进行一种操作(v,d),对以点v为终点的边的权值-d,对以点v为起点的边的权值+d.现在给出一个有向带权图,为能否经过一系列的(v,d)操作使图上的每一条边的权值为正,若能,求最小 ...
- UVA 11478 Halum
Halum Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA. Original ID: 114 ...
- POJ1275 Cashier Employment 【二分 + 差分约束】
题目链接 POJ1275 题解 显然可以差分约束 我们记\(W[i]\)为\(i\)时刻可以开始工作的人数 令\(s[i]\)为前\(i\)个时刻开始工作的人数的前缀和 每个时刻的要求\(r[i]\) ...
- UVA11478 Halum (差分约束)
每次操作是独立的,而且顺序并不影响,作用在同一个结点上的d可以叠加,所以令x(u) = sigma(dui). 最后就是要确定所有的x(u). 因为m越大,满足条件的边就越少,二分答案m. 对于一条边 ...
- UVA 11478 Halum (差分约束)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- Uva 11478 Halum操作
题目链接:http://vjudge.net/contest/143318#problem/B 题意:给定一个有向图,每条边都有一个权值.每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权 ...
随机推荐
- Java基础教程:网络编程
Java基础教程:网络编程 基础 Socket与ServerSocket Socket又称"套接字",网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个s ...
- Linux 安装配置 Nginx
前言 准备用flask做一个自己的博客网站,打算用Nginx来部署,所以在阿里云的服务器上安装Nginx,参考了很多教程,现在将步骤以及自己遇到的坑写下来,希望能对别人有所帮助. 我用的服务器是阿里云 ...
- vuex的一个坑
1 error in callback for watcher "function (){ return this._data.$$state }" 用深拷贝解决 2 接口依赖: ...
- Good Bye 2018 Solution
A. New Year and the Christmas Ornament 签到. #include <bits/stdc++.h> using namespace std; int a ...
- UnicodeDecodeError: 'ascii' codec can't decode byte 0xbb in position 51: ord
1.问题描述:一个在Django框架下使用Python编写的定时更新项目,在Windows系统下测试无误,在Linux系统下测试,报如下错误: ascii codec can't decode byt ...
- bzoj1009 / P3193 [HNOI2008]GT考试
P3193 [HNOI2008]GT考试 设$f[i][j]$表示主串匹配到第$i$个位置,不吉利数字匹配到第$j$个位置 $g[i][j]$表示加上某数字使子串原来最多能匹配到第$i$个数字,现在只 ...
- Python3.6(windows系统)通过pip安装bs4
Python3.6(windows系统)通过pip安装bs4 cmd安装命令: pip install beautifulsoup4 执行结果:
- MSBI
https://blog.csdn.net/fanyingnedu/article/details/78597207 Familiarity with Microsoft BI Stack - SSI ...
- luogu p1219 八皇后
https://www.luogu.org/problem/show?pid=1219 经典问题,搜索一遍过. 重点是判断皇后能否在map[x][y]放下的条件 因为是dfs的时候过程中 x 是递增的 ...
- Android反射机制:手把手教你实现反射
什么是反射机制? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称 ...