【高斯消元】BZOJ3503 [Cqoi2014]和谐矩阵

3503: [Cqoi2014]和谐矩阵

Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special Judge
Submit: 1197  Solved: 570
[Submit][Status][Discuss]

Description

我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1。一个元素相邻的元素包括它本

身,及他上下左右的4个元素(如果存在)。

给定矩阵的行数和列数,请计算并输出一个和谐的矩阵。注意:所有元素为0的矩阵是不允许的。

Input

输入一行,包含两个空格分隔的整数m和n,分别表示矩阵的行数和列数。

Output

输出包含m行,每行n个空格分隔整数(0或1),为所求矩阵。测试数据保证有解。

Sample Input

4 4

Sample Output

0 1 0 0

1 1 1 0

0 0 0 1

1 1 0 1

数据范围

1 <=m, n <=40

题解

高斯消元解异或方程组

将第一行的未知数设成xi

则可以推出其他行和xi的关系

解方程组即可

代码

//by 减维
#include<set>
#include<map>
#include<queue>
#include<ctime>
#include<cmath>
#include<bitset>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define il inline
#define rg register
#define db double
#define mpr make_pair
#define maxn 2005
#define inf (1<<30)
#define eps 1e-8
#define pi 3.1415926535897932384626L
using namespace std;

inline int read()
{
    int ret=0;bool fla=0;char ch=getchar();
    while((ch<‘0‘||ch>‘9‘)&&ch!=‘-‘)ch=getchar();
    if(ch==‘-‘){fla=1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){ret=ret*10+ch-‘0‘;ch=getchar();}
    return fla?-ret:ret;
}

int n,m,cnt,pos[maxn];
int tx[4]={1,0,0,-1};
int ty[4]={0,1,-1,0};
bitset<maxn> a[maxn];

il int gi(int x,int y){return (x-1)*m+y;}

void gauss()
{
    int now=0;
    for(int i=1;i<=n*m;++i)
    {
        int j=now+1;
        while(!a[j][i]&&j<=n*m) j++;
        now++;
        swap(a[j],a[now]);
        for(int k=1;k<=n*m;++k)
            if(a[k][i]&&k!=now) a[k]^=a[now];
    }
}

int main()
{
    n=read(),m=read();
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
        {
            a[gi(i,j)][gi(i,j)]=1;cnt=1;
            for(int k=0;k<4;++k)
            {
                int x=i+tx[k],y=j+ty[k];
                if(x<=0||y<=0||x>n||y>m) continue ;
                a[gi(i,j)][gi(x,y)]=1;cnt++;
            }
            a[gi(i,j)][n*m+1]=(cnt&1);
        }
    gauss();
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            printf("%d%c",a[gi(i,j)][n*m+1]==0?1:0,j==m?‘\n‘:‘ ‘);
    return 0;
}

补充:实数域的高斯消元

//by 减维
#include<set>
#include<map>
#include<queue>
#include<ctime>
#include<cmath>
#include<bitset>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define il inline
#define rg register
#define db double
#define mpr make_pair
#define maxn 505
#define inf (1<<30)
#define eps 1e-5
#define pi 3.1415926535897932384626L
using namespace std;

inline int read()
{
    int ret=0;bool fla=0;char ch=getchar();
    while((ch<‘0‘||ch>‘9‘)&&ch!=‘-‘)ch=getchar();
    if(ch==‘-‘){fla=1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){ret=ret*10+ch-‘0‘;ch=getchar();}
    return fla?-ret:ret;
}

int n,m,du[maxn],ed[maxn*maxn/2][2];
db ans,a[maxn][maxn],v[maxn],val[maxn*maxn/2];

bool cmp(db x,db y){return x>y;}

void gauss()
{
    for(int i=1;i<=n;++i)
    {
        int j=i;
        for(int k=i+1;k<=n;++k) if(fabs(a[k][i])>fabs(a[j][i])) j=k;
        if(i!=j) for(int k=i;k<=n+1;++k) swap(a[i][k],a[j][k]);
        for(int k=i+1;k<=n;++k)
        {
            db p=a[k][i]/a[i][i];
            for(int t=i;t<=n+1;++t) a[k][t]-=a[i][t]*p;
        }
    }
    for(int i=n;i;i--)
    {
        for(int j=i+1;j<=n;++j) a[i][n+1]-=a[i][j]*v[j];
        v[i]=a[i][n+1]/a[i][i];
    }
}

int main()
{
    n=read(),m=read();
    for(int i=1;i<=m;++i)
    {
        ed[i][0]=read(),ed[i][1]=read();
        du[ed[i][0]]++;du[ed[i][1]]++;
    }
    for(int i=1;i<=m;++i)
    {
        a[ed[i][0]][ed[i][1]]=1.0/du[ed[i][1]];
        a[ed[i][1]][ed[i][0]]=1.0/du[ed[i][0]];
    }
    for(int i=1;i<n;++i) a[i][i]=-1.0;
    for(int i=1;i<=n;++i) a[n][i]=0;
    a[n][n]=1;a[1][n+1]=-1.0;
    gauss();
    for(int i=1;i<=m;++i) val[i]=v[ed[i][0]]/du[ed[i][0]]+v[ed[i][1]]/du[ed[i][1]];
    sort(val+1,val+m+1,cmp);
    for(int i=1;i<=m;++i) ans+=1.0*val[i]*i;
    printf("%.3lf",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/rir1715/p/8581298.html

时间: 2024-11-05 12:12:22

【高斯消元】BZOJ3503 [Cqoi2014]和谐矩阵的相关文章

BZOJ3503: [Cqoi2014]和谐矩阵

题解: 如果第一行的数知道了,我们就可以推出其他行的数. 那么如何判断第一行的数的一种填法是否合法呢?很简单,我们递推出m+1行的数,当且仅当这一行都是0时满足题意. 那么,我们就有了一种想法. 直接把m+1行的每个数用x[1..n]表示出来,这一定是个系数只为0/1的式子.然后让这个异或值=0,就可以解异或方程组了. 系数怎么推呢? for1(i,n)b[1][i]=(ll)1<<i-1; for2(i,2,m+1) for1(j,n) b[i][j]=b[i-1][j]^b[i-1][j-

2017湘潭赛 A题 Determinant (高斯消元取模)

链接 http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1260 今年湘潭的A题 题意不难 大意是把n*(n+1)矩阵去掉某一列 求去掉那一列之后的对应的行列式的值 mod 1e9+7 思路1  : 先做一次高斯消元 得到一个阶梯矩阵  只有最后两列没有被消元 然后每去掉一列 拿出新的矩阵  做一次消元 1      a12   a13   a14 0       1      a23   a24 0        0  

HDU5088Revenge of Nim II(高斯消元求自由变元个数)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5088 题意: 有n堆石头,可以去掉其中的一些堆(保证至少剩下一堆)问存不存在一种方法使第二个人赢: 分析: 这k个数边构成了一个01矩阵.那么能异或出0的充分条件是对这01矩阵高斯消元以后矩阵的秩小于矩阵的行数(也即存在一行全零,全零行就是异或出来的一行),那么我们只要对这个01矩阵高斯消元即可. 代码如下: #include<cstdio> #include<cstring> #in

【BZOJ3503】【Cqoi2014】和谐矩阵 高斯消元,解异或方程组

#include <stdio.h> int main() { puts("转载请注明出处"); puts("地址:blog.csdn.net/vmurder/article/details/43699831"); } 题解: 随便搞搞就好. 自由元全当成1就好了么~~~ 不会异或方程组的移步这里[POJ1222]EXTENDED LIGHTS OUT 高斯消元.解异或方程组 代码: #include <cstdio> #include &l

BZOJ_3503_[Cqoi2014]和谐矩阵_高斯消元

题意: 我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1.一个元素相邻的元素包括它本身,及他上下左右的4个元素(如果存在).给定矩阵的行数和列数,请计算并输出一个和谐的矩阵.注意:所有元素为0的矩阵是不允许的. 分析: 考虑一种暴力,设n*m个未知数,列n*m个方程 高斯消元解方程,注意全零矩阵不合法 那我们如果发现有自由元就将它们置为1 代码: #include <stdio.h> #include <string.h> #include <algo

Luogu3164 CQOI2014 和谐矩阵 异或、高斯消元

传送门 题意:给出$N,M$,试构造一个$N \times M$的非全$0$矩阵,其中所有格子都满足:它和它上下左右四个格子的权值之和为偶数.$N , M \leq 40$ 可以依据题目中的条件列出有$N \times M$的元.$N \times M$个方程的异或方程组(异或方程组就是所有位置都是$1$或$0$,最右边一列的答案需要通过异或互相消除的方程组,一般在$mod\,2$意义下产生). 理论上元和方程组数量一致的时候每一个元都是有唯一解的,但是在有解的情况下,其中一些方程是线性相关的,

[spoj104][Highways] (生成树计数+矩阵树定理+高斯消元)

In some countries building highways takes a lot of time... Maybe that's because there are many possiblities to construct a network of highways and engineers can't make up their minds which one to choose. Suppose we have a list of cities that can be c

【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元

题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两个不同端点A_j和B_j (1 <= A_j<= N; 1 <= B_j <= N)表示的双向道路连接.保证城市1至少连接一个其它的城市.一开始臭气弹会被放在城市1.每个小时(包括第一个小时),它有P/Q (1 <= P <=1,000,000; 1 <= Q <

矩阵算法 高斯消元 行列式 矩阵的秩

今天学习一下矩阵的基本算法 高斯消元是解线性方程组的有力工具. 基本思想是通过将增广矩阵经过行初等变化变成简化阶梯形矩阵. 下面采用的是列主元高斯消元法,复杂度为O(n^3). 很容易根据高斯消元法的过程得出行列式和秩的算法. 代码: /********************************************************* * ------------------ * * author AbyssalFish * ***************************