P2962 [USACO09NOV]灯Lights

放肆的年华 提交于 2019-11-28 18:02:11

P2962 [USACO09NOV]灯Lights

guass消元异或方程组

#include<bits/stdc++.h>
using namespace std;
#define maxn 100
#define sc(x) scanf("%lld",&x);
#define int long long
int A[maxn][maxn];
int x[maxn];
int ans=1000;
int n,m;
void guass()
{
    for(int i=1; i<=n; i++)
    {
        int t=i;
        if(!A[t][t])
        {
            for(int j=i+1; j<=n; j++)
            {
                if(A[j][i])
                {
                    t=j;
                    break;
                }
            }
            swap(A[i],A[t]);
        }
        for(int k=i+1; k<=n; k++)
        {
            if(A[k][i])
            {
                for(int j=1; j<=n+1; j++)
                {
                    A[k][j]^=A[i][j];///消元
                }
            }
        }

    }
}

void dfs(int i,int t)
{
    if(t>ans)return;
    if(i==0){
        ans=min(t,ans);
        return;
    }
    if(A[i][i]){
        x[i]=A[i][n+1];
        for(int j=i+1;j<=n;j++)
        if(A[i][j]){x[i]^=x[j];}
        if(x[i])dfs(i-1,t+1);
        else dfs(i-1,t);
    }else{
      x[i]=0;
      dfs(i-1,t);
      x[i]=1;
      dfs(i-1,t+1);

    }

}
signed main()
{
    sc(n);sc(m);
    int x,y;
    while(m--){
        sc(x);sc(y);
        A[x][y]=A[y][x]=1;
    }
    for(int i=1;i<=n;i++)A[i][i]=A[i][n+1]=1;
    guass();
    dfs(n,0);
    cout<<ans<<'\n';
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!