标题被网络流虐菜了

前言

被云落骂了,为了证明我现在有多菜,他让我做了这道题

正文

构造矩阵

要求构造一个 n×m01 矩阵,满足每一行中 1 的个数分别为 r1,r2,,rn ,每一列中1的个数为 c1,c2,,cm

在此基础上要求字典序最小。两个矩阵比较字典序时先比较第一行,第一行相等再比较第二行……

n,m100

不考虑字典序的构造

行列拆开,把源点连向行,容量为 ri,列连向列,容量为 ci,行列之间连,容量为 1,代表每个格子只能选一个 1

加上字典序,越先取 0 越好

那么如果一个数能取 0 ,就尽量取 0

我们又知道了在上面的算法中在增广路上的点可以填 1

那么填 0 的情况除了不在增广路上,就是在增广路上但不要这个点还有其他增广路

int check(int x,int y){
    dinic();
	if(!r1[x]||!c1[y-n])return 1;//0的数量
	r1[x]--,c1[y-n]--;
	if(e[a[x][y]].w){
		e[a[x][y]].w=0;
		e[a[x][y]^1].w=0;
		return 0;
	}else{
		e[a[x][y]].w=0;
		e[a[x][y]^1].w=0;
		e[a[s][x]].w++;
		e[a[s][x]^1].w--;
		e[a[y][t]].w++;
		e[a[y][t]^1].w--;
		if(dinic()==1)return 0;
        r1[x]++,c1[y-n]++;
		e[a[y][t]].w--;
		e[a[y][t]^1].w++;
		e[a[s][x]].w--;
		e[a[s][x]^1].w++;		
		return 1;
	}
}

势能

2.对任意两个连通的节点 x,y,从 xy 的所有路径 xi(流量)的和都是相等的

由这条,我们可以给每个点加一个势能(可以看看第一篇题解的图)

out(i) 表示 i 连向的点,in(i) 表示连向 i 的点,可以列出来一个方程:(hihin(i))=(hout(i)hi)

n-2 个方程,1,n 随便附个势能

如果我们把所有点高度都按照一定比例缩放,这两个限制仍然是成立的。

我们找到能缩放的最大比例,然后进行缩放,就得到了最大流(即和汇点相连的边的流量之和)和每条边的流量。

神题

对于每一天向后一天连边 (infai,0)

对于每一种志愿者选择,si​ 向 ti+1 连边 (inf,ci)

从超级源向第一天连边 (inf,0)

从最后一天+1向超级汇连边 (inf,0)

这个就是

你需要先保证最大流,然后再看费用

后记

不嘻嘻

posted @   小惰惰  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
/* 鼠标点击求赞文字特效 */
点击右上角即可分享
微信分享提示

目录导航