1 条题解

  • 0
    @ 2025-8-24 22:01:17

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Morpheuse
    学长说,多读博客少做题,套路就是力量.

    搬运于2025-08-24 22:01:17,当前版本为作者最后更新于2022-03-30 21:50:50,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    并不需要上下界网络流.

    题意

    mm 条可相交的路径覆盖每个点 viv_i 次.

    做法

    对于每个点 ii 有且仅有 viv_i 次进入,也有 viv_i 次离开.

    ss 为源点, tt 为汇点.

    以下除特殊说明,费用均为 00.

    sis\to i 流量为 viv_i 表示一定有 viv_i 次离开.

    i+nti + n \to t 流量为 viv_i 表示必须要有 viv_i 次进入.

    因为 mm 个人都可以从任意点开始.

    相当于我们有 mm 次无需费用即可进入的权限.

    所以我们新建一个点 MM.

    sMs\to M 流量为 mm 表示有 mm 次无需费用进入的权限.

    对于每个 i,Mi+ni , M\to i + n 流量为 infinf 表示可以从无需费用进入 ii.

    对于每条边 (u,v,w)(u,v,w) 建边 uv+nu\to v + n 流量为 infinf , 费用为 wiw_i.

    最小费用最大流即可.

    代码

    scanf("%d%d", &n,&m);
    for(int i = 1 ; i <= n ; ++ i) scanf("%d", &a[i]);
    s = 0 , t = maxn - 10;
    
    /*
    源点.
    数组大小.
    初始化. 
    */
    int ss = maxn - 11;
    add(s , ss , m , 0);
    for(int i = 1 ; i <= n ; ++ i)
    	add(ss , i + n , inf , 0);
    for(int i = 1 ; i <= n ; ++ i)
    	add(s , i , a[i] , 0);
    for(int i = 1 ; i <= n ; ++ i)
    	add(i + n , t , a[i] , 0);
    for(int i = 1 ; i <= n - 1 ; ++ i)
    {
    	for(int j = 1 ; j <= n - i ; ++ j)
    	{
    		int x;
    		scanf("%d", &x);
    		if(x == -1) x = inf;
    		add(i , i + j + n , inf , x);
    	}
    }
    printf("%d", cot);
    
    • 1

    信息

    ID
    3552
    时间
    1000ms
    内存
    128MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者