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),由此可以建立差分约束系统。

无解:如果最小值为1时依然不成立。

任意解:如果最小值为R+1时成立。

否则二分答案取最大值,当图中有负权环时差分约束系统无解即二分答案不成立。

【代码】

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<vector>
 4 #include<queue>
 5 using namespace std;
 6
 7 const int maxn = 1000+10;
 8
 9 int n,m;
10 struct Edge { int u,v,w;
11 };
12 vector<int> G[maxn];
13 vector<Edge> es;
14 void addedge(int u,int v,int w) {
15     es.push_back((Edge){u,v,w});
16     int m=es.size();  G[u].push_back(m-1);
17 }
18 bool spfa() {
19     queue<int> q;
20     int inq[maxn],d[maxn],cnt[maxn];
21     memset(inq,0,sizeof(inq));
22     memset(cnt,0,sizeof(cnt));
23     for(int i=1;i<=n;i++)
24         d[i]=0 , inq[i]=1 , q.push(i);
25     while(!q.empty()) {
26         int u=q.front(); q.pop(); inq[u]=0;
27         for(int i=0;i<G[u].size();i++) {
28             Edge e=es[G[u][i]];
29             int v=e.v;
30             if(d[v]>d[u]+e.w) {
31                 d[v]=d[u]+e.w;
32                 if(!inq[v]) {
33                     inq[v]=1 , q.push(v);
34                     if(++cnt[v]>(n)) return false;
35                 }
36             }
37         }
38     }
39     return true;
40 }
41 bool can(int x) {
42     for(int i=0;i<es.size();i++) es[i].w-=x;
43     bool ans=spfa();
44     for(int i=0;i<es.size();i++) es[i].w+=x;
45     return ans;
46 }
47
48 int main() {
49     while(scanf("%d%d",&n,&m)==2) {
50         es.clear();
51         for(int i=1;i<=n;i++) G[i].clear();
52         int u,v,w;
53         int L=0,R=0;
54         for(int i=0;i<m;i++) {
55             scanf("%d%d%d",&u,&v,&w);
56             addedge(u,v,w); R=max(R,w);
57         }
58         if(can(R+1)) printf("Infinite\n");
59         else if(!can(1)) printf("No Solution\n");
60         else {
61             while(L<R) {
62                 int M=L+(R-L+1)/2;
63                 if(can(M)) L=M; else R=M-1;
64             }
65             printf("%d\n",L);
66         }
67     }
68     return 0;
69 }
时间: 2024-12-23 17:38:13

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

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

题目大意:有一种操作(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 - 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 Bellman-Ford+差分约束系统

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

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)

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

Halum Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA. Original ID: 1147864-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) th

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

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