摘要: 刘汝佳新书--训练指南题意:给定一个有向图,每条边都有一个权值。每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权值减小d,把所有以v为起点的边的权值增加d,最后让所有边的权值的最小值大于零且尽量大。分析:因为不同的操作互不影响,因此可以按任意顺序实施这些操作。另外,对于同一个点的多次操作可以合并,因此可以令sum(u)为作用于结点u之上的所有d之和。这样,本题的目标就是确定所有的sum(u),使得操作之后所有边权的最小值尽量大。“最小值最大”使用二分答案的方法。二分答案x之后,问题转化为是否可以让操作完毕后每条边的权值均不小于x。对于边a->b,不难发现操作完毕后它的权值为 阅读全文
posted @ 2013-02-15 15:10 z.arbitrary 阅读(704) 评论(0) 推荐(1) 编辑
摘要: 题意:给定一个n个点m条边的加权有向图,求平均权值最小的回路。分析:使用二分法求解。对于一个猜测值mid,只需要判断是否存在平均值小于mid的回路。如何判断呢?假设存在一个包含k条边的回路,回路上各条变的权值为w1,w2,....,wk,那么平均值小于mid意味着w1+w2+....+wk《K*mid,即:(w1-mid)+(w2-mid)+...+(wk-mid)<0换句话说,只要把每条边(a,b)的全w(a,b)变成w(a,b)-mid,再判断新图中是否有负权回路即可。// File Name: 11090.cpp// Author: zlbing// Created Time: 2 阅读全文
posted @ 2013-02-15 00:31 z.arbitrary 阅读(476) 评论(0) 推荐(0) 编辑
摘要: struct Edge{ int from,to; int dist;};struct BellmanFord{ int n,m; vector<Edge>edges; vector<int>G[MAXN]; bool inq[MAXN]; int d[MAXN]; int p[MAXN]; int cnt[MAXN]; void init(int n) { this->n=n; for(int i=0;i<n;i++)G[i].clear(); edges.clear(); } ... 阅读全文
posted @ 2013-02-15 00:17 z.arbitrary 阅读(197) 评论(0) 推荐(0) 编辑