UVA11478 Halum (差分约束)
每次操作是独立的,而且顺序并不影响,作用在同一个结点上的d可以叠加,所以令x(u) = sigma(dui).
最后就是要确定所有的x(u)。
因为m越大,满足条件的边就越少,二分答案m。
对于一条边a->b,可以列出一个不等式d(a,b) +x(a)-x(b)>=m,移项可得x(b)-x(a)<=d(a,b)-m
正好满足差分约束的形式。所有的边就对应着一个差分约束系统。
差分约束有解的充要条件是不存在负环。
证明:
x(b)-x(a)<=-c,c>0,意味着x(a)至少比x(b)大c,
因为不等式的传递性,如果x(a)在一个负环上,那么意味着x(a)>x(a),这是矛盾的。
因为一开始图不一定连通,可以加一个源点和其他所有点相连,边权为0,用源点的距离表示x(i)的值,
或者sfpa的时候把所有的点加入栈中(判负环用stack比较快)
#include<bits/stdc++.h>
using namespace std; //#define LOCAL
const int maxn = ,maxm = ;
int hd[maxn],nx[maxm],to[maxm],d[maxm];
int n,m; int D[maxn],vis[maxn];
int cnt[maxn]; bool spfa()
{
stack<int>S;
memset(cnt,,sizeof(cnt));
for(int i = ; i <= n; i++) { vis[i] = true; D[i] = .; S.push(i); }
while(S.size()){
int u = S.top(); S.pop();
vis[u] = false;
for(int i = hd[u]; ~i; i = nx[i]){
int v = to[i];
if(D[v]>D[u]+d[i]){
D[v] = D[u]+d[i];
if(!vis[v]){
S.push(v); vis[v] = true;
if(++cnt[v] > n) return true;
}
}
}
}
return false;
}
bool P(int x)
{
for(int i = ; i < m; i++) d[i] -= x;
for(int i = ; i <= n; i++) D[i] = ;
bool fg = spfa();
for(int i = ; i < m; i++) d[i] += x;
return fg;
} int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
while(~scanf("%d%d",&n,&m)){
memset(hd,-,sizeof(hd));
int l = ,r = ;
for(int i = ; i < m; i++){
int u; scanf("%d%d%d",&u,to+i,d+i);
nx[i] = hd[u];
hd[u] = i;
r = max(r,d[i]);
}
if(P(l)) { puts("No Solution"); continue; }
if(!P(r+)) { puts("Infinite"); continue; }
while(l<r){
int x = (l+r+)>>;
!P(x)?l = x:r = x-;
}
printf("%d\n",l);
}
return ;
}
UVA11478 Halum (差分约束)的更多相关文章
- UVA11478 Halum [差分约束系统]
https://vjudge.net/problem/UVA-11478 给定一个有向图,每条边都有一个权值.每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权值减小d,把所有以v为起点的 ...
- UVA 11478 Halum (差分约束)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- UVA 11478 Halum(用bellman-ford解差分约束)
对于一个有向带权图,进行一种操作(v,d),对以点v为终点的边的权值-d,对以点v为起点的边的权值+d.现在给出一个有向带权图,为能否经过一系列的(v,d)操作使图上的每一条边的权值为正,若能,求最小 ...
- Halum UVA - 11478 差分约束
输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 复制 2 1 1 2 10 2 1 1 2 -10 3 3 1 2 4 2 3 2 3 1 5 4 5 2 3 4 4 2 5 3 ...
- 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束)
layout: post title: 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束) author: "luowentaoaa" catal ...
- Candies-POJ3159差分约束
Time Limit: 1500MS Memory Limit: 131072K Description During the kindergarten days, flymouse was the ...
- poj3159 差分约束 spfa
//Accepted 2692 KB 1282 ms //差分约束 -->最短路 //TLE到死,加了输入挂,手写queue #include <cstdio> #include & ...
- ZOJ 2770火烧连营——差分约束
偶尔做了一下差分约束. 题目大意:给出n个军营,每个军营最多有ci个士兵,且[ai,bi]之间至少有ki个士兵,问最少有多少士兵. ---------------------------------- ...
- POJ 2983 Is the Information Reliable? 差分约束
裸差分约束. //#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #i ...
随机推荐
- 【机器学习】决策树C4.5、ID3
一.算法流程 step1:计算信息熵 step2: 划分数据集 step3: 创建决策树 step4: 利用决策树分类 二.信息熵Entropy.信息增益Gain 重点:选择一个属性进行分支.注意信息 ...
- pythonDB api的学习
有时候需要操作数据库,为了能使用统一的接口访问,我们采用Python DB API,地址为 https://www.python.org/dev/peps/pep-0249/ 全文参考---“疯狂的蚂 ...
- 使用gRPC搭建Server端与Client端
gRPC简介 gRPC是一种RPC框架技术,采用Protocal Buffers(协议缓存) 作为其接口定义的语言(就是Proto来写接口)和基础的消息交换格式. 在gRPC中,客户端应用程序可以直接 ...
- C++经典面试算法题
转自:http://blog.csdn.net/f_r_e_e_x/article/details/50770907 //1.实现strcpy. char* MyStrCpy( char *pDest ...
- TensorFlow中设置学习率的方式
目录 1. 指数衰减 2. 分段常数衰减 3. 自然指数衰减 4. 多项式衰减 5. 倒数衰减 6. 余弦衰减 6.1 标准余弦衰减 6.2 重启余弦衰减 6.3 线性余弦噪声 6.4 噪声余弦衰减 ...
- spring配置与使用
1. 创建基于java的配置. 配置极少量的XML来启用java配置: <?xml version="1.0" encoding="UTF-8"?> ...
- C#中的结构体要使用new来实例化吗?
声明结构的默认(无参数)构造函数是错误的.总是提供默认构造函数以将结构成员初始化为它们的默认值.在结构中初始化实例字段也是错误的. 如果使用 new 运算符创建结构对象,则会创建该结构对象,并调用适当 ...
- 如何使用JAR文件重用JMeter代码并节省时间
在开发测试时,通常需要在测试中编写代码.此代码可能很长,可能会在多个测试中重复,或者可能仅针对特定测试编写.此外,如果要求发生变化,则在测试中编写的代码可能必须更改或补充. 这可能需要很长时间并且容易 ...
- CF920F SUM and REPLACE 线段树
给你一个数组a_i,D(x)为x的约数个数 两种操作: 1.将[l,r]的a_i替换为D(a_i) 2.输出∑a_i ( l <= i <= r ) 当区间最大值<=2时,就不 ...
- P2184 贪婪大陆 树状数组
树状数组帅炸了....又被一道水题轻虐,又被学长指出了一个错误....我太菜了QAQ 开两个树状数组,一个记录左端点,一个记录右端点: 共有cnt(总数) - (<l的右端点数目) - (> ...