【BZOJ3996】【TJOI2015】线性代数 最小割

链接:

#include <stdio.h>
int main()
{
    puts("转载请注明出处[vmurder]谢谢");
    puts("网址:blog.csdn.net/vmurder/article/details/45200381");
}

题解:

题意部分注释:最终的矩阵 D 长宽都1,所以其实要求的是一个数

首先 (A×B?C)×AT=A×B×AT?C×AT

然后发现

左边式子 Ai 和 ATj 都选的时候才会得到 Bi,j 的价值

如果 ATi 是1,那么就会损失 Ci 的价值。

这是个裸的最小割模型。

代码:

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 260000
#define M 1600000
#define inf 0x3f3f3f3f
using namespace std;
struct Eli
{
    int v,len,next;
}e[M];
int head[N],cnt;
inline void add(int u,int v,int len)
{
    e[++cnt].v=v;
    e[cnt].len=len;
    e[cnt].next=head[u];
    head[u]=cnt;
}
inline void Add(int u,int v,int len)
{
    add(u,v,len),add(v,u,0);
}
queue<int>q;
int d[N],s,t;
bool bfs()
{
    while(!q.empty())q.pop();
    memset(d,0,sizeof d);
    int i,u,v;
    q.push(s),d[s]=1;
    while(!q.empty())
    {
        u=q.front(),q.pop();
        for(i=head[u];i;i=e[i].next)
        {
            if(!d[v=e[i].v]&&e[i].len)
            {
                d[v]=d[u]+1;
                if(v==t)return 1;
                q.push(v);
            }
        }
    }
    return 0;
}
int dinic(int x,int flow)
{
    if(x==t)return flow;
    int i,u,v,k,remain=flow;
    for(i=head[x];i&&remain;i=e[i].next)
    {
        if(d[v=e[i].v]==d[x]+1&&e[i].len)
        {
            k=dinic(v,min(e[i].len,remain));
            if(!k)d[v]=0;
            e[i].len-=k,e[i^1].len+=k;
            remain-=k;
        }
    }
    return flow-remain;
}

int n,maxflow,id;
void build()
{
    int i,j,k;
    int a,b,c;

    scanf("%d",&n);
    cnt=1,s=0,t=n*n+n+1,id=n;

    for(i=1;i<=n;i++)for(j=1;j<=n;j++)
    {
        scanf("%d",&k);
        maxflow+=k,id++;
        Add(s,id,k),Add(id,i,inf),Add(id,j,inf);
    }
    for(i=1;i<=n;i++)
    {
        scanf("%d",&k);
        Add(i,t,k);
    }
}
int main()
{
    build();
    while(bfs())maxflow-=dinic(s,inf);
    cout<<maxflow<<endl;
    return 0;
}
时间: 2024-10-14 11:16:31

【BZOJ3996】【TJOI2015】线性代数 最小割的相关文章

BZOJ3996[TJOI2015]线性代数

Description 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的转置.输出D Input 第一行输入一个整数N,接下来N行输入B矩阵,第i行第J个数字代表Bij. 接下来一行输入N个整数,代表矩阵C.矩阵B和矩阵C中每个数字都是不超过1000的非负整数. Output 输出最大的D Sample Input 3 1 2 1 3 1 0 1 2 3 2 3 7 Sample Output 2 HINT 1<=N<

BZOJ3996 TJOI2015线性代数

先把矩阵式子化简 原式=∑i=1n∑j=1nA[i]∗B[i][j]∗A[j]−∑i=1nA[i]∗C[i] 因此我们发现问题转化为选取一个点所获收益是B[i][j],代价是C[i][j] 这是一个最小割问题. 先把答案记做所有b的和. 将边按照s——>p[i][j](b[i][j])  p[i][j]——>i p[i][j]——>j i——>t(c[i])这样建图后我们删去的那个最小割意义就是花费最少的使得整个图不连通的量 如果删在左边就意味着这件物品我们不要了,如果删去右边的话

【bzoj3996】[TJOI2015]线性代数 最大权闭合图

题目描述 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的转置.输出D 输入 第一行输入一个整数N,接下来N行输入B矩阵,第i行第J个数字代表Bij. 接下来一行输入N个整数,代表矩阵C.矩阵B和矩阵C中每个数字都是不超过1000的非负整数. 输出 输出最大的D 样例输入 3 1 2 1 3 1 0 1 2 3 2 3 7 样例输出 2 题解 网络流最大权闭合图 (推导过程什么的不重要,只要注意一下矩阵乘法不满足结合律

[TJOI2015]线性代数

题目链接 戳我 \(Describe\) 题目描述 为了提高智商,\(ZJY\)开始学习线性代数.她的小伙伴菠萝给她出了这样一个问题:给定一个\(n×n\)的矩阵\(B\)和一个\(1×n\)的矩阵\(C\).求出一个\(1×n\)的\(01\)矩阵\(A\).使得\(D=(A*B-C)*A^T\) 最大,其中\(A^T\)为\(A\)的转置.输出\(D\). 输入格式: 第一行输入一个整数\(n\).接下来\(n\)行输入\(B\)矩阵,第\(i\)行第\(j\)个数代表\(B\)接下来一行输

关于最小割建模正确性证明

来写一下对于最小割建模正确性的理解,困扰了好几天,今天算是看懂了. 前置知识:闭合子图,即一张图,图中边的终点也在该图中(可以选某点,但是不选它连接的边),其实就是割开一些边拿到一张闭合子图. 首先,明确一点,最初始的情况是只有点权,边代表关系$i \rightarrow j$表示选$i$必须选$j$如此云云.一般的套路就是:正权点和S相连,而负权点和T相连,容量均为点权绝对值,而原本的边照连,但是容量为INF. 其次:正确性证明,假设我们已经将$S$.$T$割开,并且$S$肯定是一张闭合子图(

【BZOJ2039】【2009国家集训队】人员雇佣 [最小割]

人员雇佣 Time Limit: 20 Sec  Memory Limit: 259 MB[Submit][Status][Discuss] Description 作为一个富有经营头脑的富翁,小L决定从本国最优秀的经理中雇佣一些来经营自己的公司.这些经理相互之间合作有一个贡献指数,(我们用Ei,j表示i经理对j经理的了解程度),即当经理i和经理j同时被雇佣时,经理i会对经理j做出贡献,使得所赚得的利润增加Ei,j.当然,雇佣每一个经理都需要花费一定的金钱Ai,对于一些经理可能他做出的贡献不值得

hdoj 4289 Control 【拆点 求最小割】

Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2295    Accepted Submission(s): 961 Problem Description You, the head of Department of Security, recently received a top-secret informati

There is a war (hdu 2435 最小割+枚举)

There is a war Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 970    Accepted Submission(s): 277 Problem Description There is a sea. There are N islands in the sea. There are some directional

HDU 3657 Game(取数 最小割)经典

Game Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1065    Accepted Submission(s): 449 Problem Description onmylove has invented a game on n × m grids. There is one positive integer on each g