UVA11478 [Halum] 二分答案+SPFA差分约束系统
来源:互联网 发布:恒讯营销软件 编辑:程序博客网 时间:2024/06/07 04:42
题目链接
题意:给定一个有向图,每条边都有一个权值。每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权值减小d,把所有以v为起点的边的权值增加d,最后让所有边的权值的最小值大于零且尽量大。
解题思路:二分答案,找出ans,用差分约束系统来check。
令sum[u],表示u节点在所有的操作后的d之和。
sum[j]-sum[i]<=w[i,j]-ans (i->j)
如果L=1时有负环无解 —————— R=max(w)+1时无负环有无数解
#include <cstdio>#include <iostream>#include <queue>#include <cstring>#include <vector>using namespace std;#define Inf 0x3f3f3f3fconst int N = 505;struct Edge{ int u, v, w; Edge(int u, int v, int w):u(u),v(v),w(w){}}; struct SPFA{ int n, m; int d[N], cnt[N]; bool inq[N]; vector<Edge> edges; vector<int> G[N]; void init(int n){ this->n=n; for ( int i=1; i<=n; i++ ) G[i].clear(); edges.clear(); } void addeage(int u, int v, int w){ edges.push_back(Edge(u,v,w)); m=edges.size(); G[u].push_back(m-1); } bool spfa(){ for ( int i=1; i<=n; i++ ) inq[i]=0, cnt[i]=0; queue<int> Q; for ( int i=1; i<=n; i++ ) { d[i]=0; Q.push(i); } while( !Q.empty() ){ int u=Q.front(); Q.pop(); inq[u]=false; for ( int i=0; i<G[u].size(); i++ ){ Edge& e=edges[G[u][i]]; if( d[e.v]>d[u]+e.w ){ d[e.v]=d[u]+e.w; if( !inq[e.v] ){ inq[e.v]=1; if( ++cnt[e.v]==n ) return false; Q.push(e.v); } } } } return true; }}S;int n, m;bool binary(int x){ for ( int i=0; i<m; i++ ) S.edges[i].w-=x; bool ret=true; if( !S.spfa() ) ret=false; for ( int i=0; i<m; i++ ) S.edges[i].w+=x; return ret;}int main(){ while( ~scanf("%d%d", &n, &m ) ){ S.init(n); int ub=0; for ( int i=1; i<=m; i++ ){ int u, v, w; scanf("%d%d%d", &u, &v, &w ); ub=max(ub,w); S.addeage(u,v,w); } int L=1, R=ub; if( binary(R) ) { puts("Infinite"); continue; } if( !binary(L) ) { puts("No Solution"); continue; } int ans=L++; while( L<R ){ int M=(L+R)>>1; if( !binary(M) ) R=M; else L=M+1, ans=M; } printf("%d\n", ans); } }
阅读全文
0 0
- UVA11478 [Halum] 二分答案+SPFA差分约束系统
- UVA11478 Halum 解题报告【图论】【二分答案】【SPFA】【差分约束系统】
- uva11478 - Halum 二分+差分约束
- uva11478 Halum【二分+差分约束】
- UVA11478 Halum (差分约束)
- UVa11478 - Halum(差分约束)
- UVA 11478V Halum 二分答案+差分约束系统
- UVA11478-Halum(BellmanFord + 差分约束)
- uva 11478 Halum (差分约束+二分+SPFA判负环)
- UVA 11478 Halum 二分+差分约束+SPFA
- uva11478(差分约束,spfa求负环)
- Uva 11478 Halum(差分约束系统 + 二分)
- uva11478差分约束
- UVA - 11478 Halum(差分约束系统)
- UVA 11478 Halum(差分约束 SPFA判负环)
- UVA 11478 Halum(二分 + 差分约束)
- POJ1275 Cashier Employment (差分约束系统 + 二分答案)
- UVA 11478 Halum(差分约束系统+Bellman-Ford)
- c++数组首元素地址与整个数组地址,算术运算区别
- Java的StrongReference、WeakReference、SoftReference、PhantomReference的理解
- android TextView 设置Marquee无效问题,最简便的设置
- UVA
- The requested resource (/) is not available
- UVA11478 [Halum] 二分答案+SPFA差分约束系统
- Select 查询 自增序列生成
- 安卓开发:自定义双向选择确认框(“确认”“取消”提示)
- np.tile 和np.newaxis
- 从一个jsp页面跳转到另一个jsp页面时的参数传递
- 解决mstar芯片638平台onAtvSignalEvent事件不上报问题
- OpenGLES获取纹理流程图
- 【python 图像绘制】图像绘制知识总结
- 4 Values whose Sum is 0 (POJ-2785) (折半枚举)