UVA 11478 Halum

Halum

Time Limit: 3000ms

Memory Limit: 131072KB

This problem will be judged on UVA. Original ID: 11478
64-bit integer IO format: %lld      Java class name: Main

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) to operate on a vertex v using an integer d as follows: subtract d from the cost of all edges that enter v and add d to the cost of every edge that leaves v.

As an example of that operation, consider graph G that has three vertices named (1, 2, 3) and two edges. Edge (1, 2) has cost -1, and edge (2,3) has cost 1. The operation Halum(2,-3) operates on edges entering and leaving vertex 2. Thus, edge (1, 2) gets cost -1-(-3)=2 and the edge (2, 3) gets cost 1 + (-3) = -2.

Your goal is to apply the Halum function to a graph, potentially repeatedly, until every edge in the graph has at least a certain cost that is greater than zero. You have to maximize this cost.

Input

Two space-separated integers per case: V(V≤500) and E(E≤2700). E lines follow. Each line represents a directed edge using three space-separated integers (u, v, d). Absolute value of cost can be at most 10000.

Output

If the problem is solvable, then print the maximum possible value. If there is no such solution print “No Solution”. If the value can be arbitrary large print “Infinite”

Sample Input

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 4 2
3 1 0
1 2 -1

Sample Output

Infinite
Infinite
3
1

解题:差分约束

 1 #include <cstdio>
 2 #include <deque>
 3 #include <cstring>
 4 #include <iostream>
 5 using namespace std;
 6 const int maxn = 510;
 7 struct arc {
 8     int to,w,next;
 9     arc(int x = 0,int y = 0,int z = -1) {
10         to = x;
11         w = y;
12         next = z;
13     }
14 } e[500000];
15 int head[maxn],tot,n,m;
16 void add(int u,int v,int w) {
17     e[tot] = arc(v,w,head[u]);
18     head[u] = tot++;
19 }
20 int d[maxn],cnt[maxn];
21 bool in[maxn];
22 bool spfa(int x) {
23     deque<int>q;
24     for(int i = 1; i <= n; ++i) {
25         cnt[i] = 1;
26         d[i] = 0;
27         in[i] = true;
28         q.push_back(i);
29     }
30     while(!q.empty()) {
31         int  u = q.front();
32         q.pop_front();
33         in[u] = false;
34         for(int i = head[u]; ~i; i = e[i].next) {
35             int tmp = e[i].w - x;
36             if(d[e[i].to] > d[u] + tmp) {
37                 d[e[i].to] = d[u] + tmp;
38                 if(!in[e[i].to]) {
39                     if(++cnt[e[i].to] > n) return false;
40                     in[e[i].to] = true;
41                     if(!q.empty() && d[q.front()] > d[e[i].to])
42                         q.push_front(e[i].to);
43                     else q.push_back(e[i].to);
44                 }
45             }
46         }
47     }
48     return true;
49 }
50 int main() {
51     int u,v,w;
52     while(~scanf("%d%d",&n,&m)) {
53         memset(head,-1,sizeof head);
54         int low = 1,high = 0;
55         for(int i = tot = 0; i < m; ++i) {
56             scanf("%d%d%d",&u,&v,&w);
57             add(u,v,w);
58             high = max(high,w);
59         }
60         if(!spfa(1)) puts("No Solution");
61         else if(spfa(high+1)) puts("Infinite");
62         else {
63             int ret;
64             while(low <= high) {
65                 int mid = (low + high)>>1;
66                 if(spfa(mid)) {
67                     ret = mid;
68                     low = mid+1;
69                 } else high = mid - 1;
70             }
71             printf("%d\n",ret);
72         }
73     }
74     return 0;
75 }

时间: 2024-10-04 07:53:37

UVA 11478 Halum的相关文章

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)

UVA - 11478 Halum (最短路应用+二分)

Description   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 operati

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(差分约束)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34651 [思路] 差分约束系统. 设结点u上的操作和为sum[u],则边(u,v)权值为d-sum[v]+sum[u].对于最小值最大问题我们想到二分答案,设二分值为x,则问题变为判断最小值为x时题目是否存在解.对于权值我们有不等式d-sum[v]+sum[u]>=x  =>  sum[v]<=sum[u]+(d-x),由此可以建立差分约束系统. 无解:如

UVA 11478 Halum(差分约束系统+Bellman-Ford)

 题意:给定一个有向图,每条边都有一个权值.每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权值减小d,把所有以v为起点的边的权值增加d,最后让所有边的权值的最小值大于零且尽量大. ps:lrj的书上有个坑,说上说非负,其实原题说要大于0.....wa了好几发 分析:因为不同的操作互不影响,因此可以按任意顺序实施这些操作.另外,对于同一个点的多次操作可以合并,因此可以令sum(u)为作用于结点u之上的所有d之和.这样,本题的目标就是确定所有的sum(u),使得操作之后所有边权的最

UVA - 11478 Halum(差分约束系统)

题目大意:有一种操作(u,c),表示所有以u为终点的边的权值减去c,所有以u为起点的边权值加上c 最后要求所有的边的权值非负且尽量大 解题思路:最小且最大,二分,枚举边的最小权值,然后看是否符合 对于给出的所有有向线段(u,v,val) 所有对u和v的操作才会影响到这条边,对其他点的操作并不会影响到,所以可以将边分开出来讨论 假设对u的操作为d[u],对v的操作为d[v],那么这条边的权值就变成了 d[u] - d[v] + val 假设枚举的边权值为w,那么这条边就要满足 d[u] - d[v

UVA 11478 Bellman-Ford+差分约束系统

[题意]: 给出一张有向图(信息为点数,边数,每条边的起点终点和权值),然后可以让你做任意次如下操作: 选择任意节点v和一个数值d,使以v为终点的边的权值减d,以v为起点的边的权值加d, 最后要满足两个条件:这些边的权值为非负,这些边中权值最小的边的权值尽量大.[知识点]: Bellman-Ford+差分约束系统[题解]: 差分约束系统:是判断不等式组有解的一种方法(具体原理还不甚理解,以后还会具体补充该文章) 例如有若干不等式形如xj-xi<=ak 那么以i为起点j为终点ak为权值建图,然后用

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

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