微信平台app网站建设,有哪些网站做的符合企业风格,报告老师怪怪怪怪物,六感程序网站建设E - Flow Gym - 102471E
题意#xff1a;
n个点#xff0c;m条边#xff0c;从点1到点n有k条相同长度的路径#xff0c;每个边都有对应的容量#xff0c;你可以进行任意次操作#xff0c;每次将一个边的容量-1#xff0c;将另一个边的容量1#xff0c;问最少操作多少…E - Flow Gym - 102471E
题意
n个点m条边从点1到点n有k条相同长度的路径每个边都有对应的容量你可以进行任意次操作每次将一个边的容量-1将另一个边的容量1问最少操作多少次可以使得跑最大流的结果最大
题解
很容易发现我们可以直接计算出最大流的最大值因为我们有所有边的容量极端操作我们可以将所有边的容量全部分配到一条路上也就是最大流的最大值sum所有流量综合一条路径的长度sum\frac{所有流量综合}{一条路径的长度}sum一条路径的长度所有流量综合 如果我们不操作当前的最大流答案为每条路径的最小值之和不过当前这个最大流的答案要比理想的sum小我们如何通过操作提升到sum 刚才分析得出最大流的结果和每一条路径的最小值有关那我们就每次操作提升最小值即可。我们将每一条道路上的边按照容量排序(每条路之间彼此独立没有影响)然后每一条路径的最小容量之和就是当前最大流sum1sum减sum1就是我们要补的量(也就是操作次数)补完后我们开始考虑每一条路径的次小值之和sum2就是当前最新的网络流与sum的差距就是再次要补的量。这样一直操作直到最新的网络流容量大于等于sum 你可能要问我们知道被补的那谁是被扣除的呢其实不用管因为我们已经求了sum也就是总有操作可以使得最大流到sum我们每次补可以认为是容量大的一些边均摊减我们不需要知道具体的操作方案只需要知道操作的影响和结果即可
代码
#include bits/stdc.h
#include unordered_map
#define debug(a, b) printf(%s %d\n, a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pairint, int PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll 1e18;
const int INF_int 0x3f3f3f3f;
void read(){};
template typename _Tp, typename... _Tps void read(_Tp x, _Tps... Ar)
{x 0;char c getchar();bool flag 0;while (c 0 || c 9)flag| (c -), c getchar();while (c 0 c 9)x (x 3) (x 1) (c ^ 48), c getchar();if (flag)x -x;read(Ar...);
}
template typename T inline void write(T x)
{if (x 0) {x ~(x - 1);putchar(-);}if (x 9)write(x / 10);putchar(x % 10 0);
}
void rd_test()
{
#ifdef ONLINE_JUDGE
#elsestartTime clock ();freopen(data.in, r, stdin);
#endif
}
void Time_test()
{
#ifdef ONLINE_JUDGE
#elseendTime clock();printf(\nRun Time:%lfs\n, (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
const int maxn2e59;
vectorpairint,ll vec[maxn];
vectorllv[maxn];
ll ans0;
int main()
{//rd_test();int n,m;read(n,m);ll tot0;for(int i1;im;i){int x,y,w;read(x,y,w);vec[x].push_back({y,w});totw;}int cnt0;for(int i0;ivec[1].size();i){cnt;int tmpvec[1][i].first;v[cnt].push_back(vec[1][i].second);while(tmp!n){v[cnt].push_back(vec[tmp][0].second);tmpvec[tmp][0].first;}}for(int i1;icnt;i){sort(v[i].begin(),v[i].end());}ll km/cnt;ll avetot/k;for(int i0;ik;i){ll sum0;for(int j1;jcnt;j)sumv[j][i];ansmax(0ll,ave-sum);}coutansendl;//Time_test();
}