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 = 501,maxm = 2705;
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,0,sizeof(cnt));
    for(int i = 1; i <= n; i++) { vis[i] = true; D[i] = 0.; 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 = 0; i < m; i++) d[i] -= x;
    for(int i = 1; i <= n; i++) D[i] = 0;
    bool fg = spfa();
    for(int i = 0; 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,-1,sizeof(hd));
        int l = 1,r = 0;
        for(int i = 0; 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+1)) { puts("Infinite"); continue; }
        while(l<r){
            int x = (l+r+1)>>1;
            !P(x)?l = x:r = x-1;
        }
        printf("%d\n",l);
    }
    return 0;
}
时间: 2024-12-28 01:20:05

UVA11478 Halum (差分约束)的相关文章

UVa11478 - Halum(差分约束)

  Problem H Halum Time Limit : 3 seconds   You are given a directed graph G(V,E) with a set of vertices and edges. Each edge (i,j) that connects some vertex i to vertex j has an integer cost associated with that edge. Define the operation Halum(v, d)

UVA11478 Halum [差分约束系统]

https://vjudge.net/problem/UVA-11478 给定一个有向图,每条边都有一个权值.每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权值减小d,把所有以v为起点的边的权值增加d,最后让所有边的权值的最小值大于零且尽量大. 该死书上翻译错了 >0不是非负 WA好几次因为这个 考虑每条边的约束,di表示i的halum量 w-dv+du>0 dv-du<w 但求解这个差分约束系统只是让这组不等式成立,最长路和最短路控制的都是单个d的最值而不是最小值最大 那

UVA 11478 Halum (差分约束)

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2473 题解: 首先我们可以得到的约束条件形如 xi - xj <= b[k] ,即可以转换为 j - > i连边,且权值为b[k],这样建图后我们判断是否有解,只需要用spfa跑负圈就可以了. 如果存在负圈,原差分系统定然无解. 简单证明: 我们不妨设这个环为 x1,

UVA 11478 - Halum(差分约束+最短路)

UVA 11478 - Halum 题目链接 题意:给定一个有向图,每次操作可以选择一个结点,把以这个点为起点的边权值+d,以这个边为终点的-d,问经过操作后,能得到的边权最小的最大值是多少,并且要判但是否无穷大或无解 思路:转化为差分约束,设一条边,他增加的权值为sum(u)减少了sum(v),那么二分答案x,得到一个不等式sum(u) - sum(v) + w(u, v) >= x,变形后得到sum(v) - sum(u) <= w(u, v) - x,这样就转化为了差分约束,直接bell

uva 11478 Halum(图论-差分约束)

  Problem H Halum Time Limit : 3 seconds   You are given a directed graph G(V,E) with a set of vertices and edges. Each edge (i,j) that connects some vertex i to vertex j has an integer cost associated with that edge. Define the operation Halum(v, d)

差分约束小结

ZOJ 2770 Burn the Linked Camp /* ZOJ 2770 Burn the Linked Camp 差分约束 */ #include <iostream> #include <cstring> #include <cstdio> #include <queue> using namespace std; const int MAXN = 1009; struct Edge { int v, ne, c; } G[MAXN*MAXN]

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

layout: post title: 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束) author: "luowentaoaa" catalog: true mathjax: true tags: - 最短路 - BellmanFord - 图论 - 训练指南 - 差分约束 Halum UVA - 11478 题意 带权有向图,每个点都可以有如下操作:令从ta出发的每一条边增加d,终止于ta的每一条边减小d 最后让所有边权的最小值非负且尽量大 题

差分约束

1.bzoj3436 思路: 差分约束根据限制条件建图,注意要有一个超级源点向所有点连一条边权为0的边建图看代码. 然后spfa判负环,写bfs会超时的......实测n遍. #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define inf 0x7fffffff #define ll long long #define N 100007 using na

bzoj2788 festival 差分约束

填坑中--链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2788 题意: 有$n$个正整数$X1,X2,...,Xn$,再给出$m1+m2$个限制条件,限制分为两类:1. 给出$a,b(1<=a,b<=n)$,要求满足$Xa + 1 = Xb$2. 给出$c,d (1<=c,d<=n)$,要求满足$Xc <= Xd$在满足所有限制的条件下,求集合${Xi}$大小的最大值. 首先看情况我们也知道是差分约束-- 但是这个差分