Gym - 102346G Getting Confidence 最小费用最大流
Gym - 102346G Getting Confidence 题意:n*n的格子,每个格子上有一个数,要求每行每列都只能拿一个数,使得乘积最大,然后输出每列选择的是第几行的数。 如果是加法的话,那么很明显,就是一个网络流。可是,现在是乘法怎么办,很简单,直接取log,那么乘法便转换成了加法,然后就可以建图。 每行每列只能取一个数,就相当于行列是拆开的点,因为需要输出的是列的信息,那么源点向每一列建一条流量为1,费用为0的边,而每一行向汇点建一条流量为1,费用为0的边。 再对于每个格子,每一列向它这一列的格子建一条流量为1,费用为0的点,而每个格子向它所在的行建一条流量为1,费用为-log(格子上的数)的边。 最后跑一遍最小费用最大流,看一下每一列的那条边流量为0 1 #include<cstdio> 2 #include<cmath> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 const int N=2e4+11,M=1e6+11,inf=1e9+7; 7 struct Side{ 8 int v,ne,w; 9 double val; 10 }S[M<<1]; 11 double dis[N]; 12 int n,sn,sb,se,head[N],vis[N],flow[N],lu[N];