深圳专业做网站技术,制作网站源码,做网站的属于什么专业,微商引流的最快方法是什么正题
AC评测记录链接#xff1a; https://www.luogu.org/record/show?rid7965757 大意
有nn个实验,有m role=presentationmm个实验器材的集合GG。完成第i role=presentationii个实验可以获得cici元#xff0c;第ii个实验需…正题
AC评测记录链接 https://www.luogu.org/record/show?rid7965757 大意
有nnn个实验,有m" role="presentation">mmm个实验器材的集合GGG。完成第i" role="presentation">iii个实验可以获得cicic_i元第iii个实验需要器材集合Si" role="presentation">SiSiS_iSi⊆GSi⊆GS_i \subseteq G。第iii个实验器材需要wi" role="presentation">wiwiw_i元求最高收入。 解题思路
我们可以从舍弃的方面思考如果做这个实验就得舍弃买器材的钱如果不做就得舍弃可获得的钱。然后就可以想到最小割如果不做就割去这个实验的边如果做就割去需要器材的边。于是我们可以这样构图 然后这样割 表示舍弃了181818加上原本实验有的353535
35−181735−1817
35-18=17 所以最高收入就是17代码
#includecstdio
#includecstring
#includealgorithm
using namespace std;
struct line{int to,next,w;
}a[100010];
int n,m,x,y,d[110],tot,state[110],num;
int head,tail,ls[110],s,e,ans,anse,t;
char c;
void addl(int x,int y,int w)
{a[tot].toy;a[tot].nextls[x];a[tot].ww;ls[x]tot;a[tot].tox;a[tot].nextls[y];a[tot].w0;ls[y]tot;
}
bool bfs()
{head0;tail1;memset(d,-1,sizeof(d));d[s]0;state[1]s;do{head;int xstate[head];for (int qls[x];~q;qa[q].next){int ya[q].to;if (a[q].w0 d[y]-1){d[y]d[x]1;state[tail]y;if (ye) return true;}}}while (headtail);return false;
}
int dinic(int x,int flow)
{int rest0,k;if (xe) return flow;for (int qls[x];~q;qa[q].next){int ya[q].to;if (a[q].w0 d[y]d[x]1){rest(kdinic(y,min(a[q].w,flow-rest)));a[q].w-k;a[q^1].wk;}}if (!rest) d[x]0;return rest;
}
int main()
{memset(ls,-1,sizeof(ls));scanf(%d%d,n,m);snm1;enm2;for (int i1;in;i){scanf(%d,t);anset;//计算全部收益addl(s,i,t);cgetchar();while ((cgetchar())!\n){if (c ) addl(i,nnum,1e9),num0;else numnum*10c-48;}addl(i,nnum,1e9);num0;}for (int i1;im;i){scanf(%d,num);addl(ni,e,num);}while (bfs())ansdinic(s,1e9);for (int i1;in;i)if (d[i]!-1)printf(%d ,i);//输出实验printf(\n);for (int i1;im;i)if (d[ni]!-1)printf(%d ,i);//输出器材printf(\n%d,anse-ans);
}