LINK1

LINK2


题目大意

给你一个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【二分】【差分约束】的更多相关文章

  1. UVA - 11478 Halum 二分+差分约束

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34651 题意: 给定一个有向图,每一条边都有一个权值,每次你可以 ...

  2. UVA 11478 Halum(差分约束)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34651 [思路] 差分约束系统. 设结点u上的操作和为sum[u] ...

  3. 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束)

    layout: post title: 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束) author: "luowentaoaa" catal ...

  4. UVA - 11478 - Halum(二分+差分约束系统)

    Problem  UVA - 11478 - Halum Time Limit: 3000 mSec Problem Description You are given a directed grap ...

  5. UVA 11478 Halum(用bellman-ford解差分约束)

    对于一个有向带权图,进行一种操作(v,d),对以点v为终点的边的权值-d,对以点v为起点的边的权值+d.现在给出一个有向带权图,为能否经过一系列的(v,d)操作使图上的每一条边的权值为正,若能,求最小 ...

  6. UVA 11478 Halum

    Halum Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA. Original ID: 114 ...

  7. POJ1275 Cashier Employment 【二分 + 差分约束】

    题目链接 POJ1275 题解 显然可以差分约束 我们记\(W[i]\)为\(i\)时刻可以开始工作的人数 令\(s[i]\)为前\(i\)个时刻开始工作的人数的前缀和 每个时刻的要求\(r[i]\) ...

  8. UVA11478 Halum (差分约束)

    每次操作是独立的,而且顺序并不影响,作用在同一个结点上的d可以叠加,所以令x(u) = sigma(dui). 最后就是要确定所有的x(u). 因为m越大,满足条件的边就越少,二分答案m. 对于一条边 ...

  9. UVA 11478 Halum (差分约束)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  10. Uva 11478 Halum操作

    题目链接:http://vjudge.net/contest/143318#problem/B 题意:给定一个有向图,每条边都有一个权值.每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权 ...

随机推荐

  1. array2xml xml2array

    array2xml/**     *     * 将简单数组转化为简单的xml     * @param string $data  要进行转化的数组     * @param string $tag ...

  2. C# Winform backgroundWorker组件使用

    BackgroundWorker 组件用来执行诸如数据库事务.文件下载等耗时的异步操作. 开始 在应用程序中添加一个BackgroundWorker实例,如果用的是VS,可以从工具上直接拖到应用程序: ...

  3. http之请求报文request

    https://blog.csdn.net/blueheart20/article/details/45174399 户端发送一个HTTP请求到服务器的请求消息包括以下格式: 请求行(request ...

  4. MyBatis—mapper.xml映射配置

    SQL文件映射(mapper文件),几个顶级元素的配置: mapper元素:根节点只有一个属性namespace(命名空间)作用: 1:用于区分不同的mapper,全局唯一. 2:绑定DAO接口,即面 ...

  5. pug 在线文档

    https://pugjs.org/zh-cn/api/getting-started.html

  6. 【运维技术】node项目使用strongloop进行部署相关教程

    node项目使用strongloop进行部署相关教程 安装strongloop 下载安装node 解压到路径完成安装 使用软链方式配置环境变量 添加cnpm的淘宝镜像源 安装node-gyp的模块依赖 ...

  7. P1314 聪明的质监员(前缀和+二分)

    P1314 聪明的质监员 显然可以二分参数W 统计Y用下前缀和即可. #include<iostream> #include<cstdio> #include<cstri ...

  8. office 2010 安装时出错 MSXML版本6.10.1129.0

    微软下载网址:https://www.microsoft.com/zh-cn/download/details.aspx?id=6276&751be11f-ede8-5a0c-058c-2ee ...

  9. 20145302张薇 《网络对抗技术》逆向及BOF基础实践

    20145302张薇 <网络对抗技术>逆向及BOF基础实践 实验内容 实践对象:名为20145302的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单 ...

  10. Xilinx Uboot网卡驱动分析

    1.MAC控制器.网卡.PHY.MDIO.mii.gmii.rgmii概念扫盲 网卡在功能上包含OSI模型的两个层,数据链路层和物理层.物理层定义了数据传送与接收所需要的电与光信号.线路状态.时钟基准 ...