Ural1042(高斯消元+枚举自由变元)

来源:互联网 发布:javaajax请求json数据 编辑:程序博客网 时间:2024/05/17 01:55

写的有点渣渣太长了。

#include <iostream>#include <cstdio>#include <queue>#include <cstring>#include <map>#include <algorithm>using namespace std;#define MAXN 255int equ,var;int a[MAXN][MAXN];int x[MAXN];int free_x[MAXN];int free_num;int hash[MAXN];int Gauss()//模板{int max_r,col,k;free_num = 0;for(k = 0, col = 0 ; k < equ && col < var ; k++, col++){max_r = k;for(int i = k+1;i < equ;i++){if(abs(a[i][col]) > abs(a[max_r][col]))max_r = i;}if(a[max_r][col] == 0){k--;free_x[free_num++] = col;hash[col]=1;continue;}if(max_r != k){for(int j = col; j < var+1; j++)swap(a[k][j],a[max_r][j]);}for(int i = k+1;i < equ;i++){if(a[i][col] != 0){ for(int j = col;j < var+1;j++)a[i][j] ^= a[k][j];}}} for(int i = k;i < equ;i++)if(a[i][col] != 0)return -1;if(k < var) return var-k;for(int i = var-1; i >= 0;i--){x[i] = a[i][var];for(int j = i+1;j < var;j++)x[i] ^= (a[i][j] && x[j]);}return 0;}int minn=MAXN;int temp[205];int c;void dfs(int pos){if (pos==free_num){c=0;for(int i = var-1-free_num; i >= 0;i--){  int pripos=i;  for (int j=i;j<var;j++)  if (!hash[j])  {  pripos=j;  break;  }x[pripos] = a[i][var];for(int j = i;j < var;j++)  if (j!=pripos)  x[pripos] ^= (a[i][j] && x[j]);}int ans[MAXN];for (int i=0;i<=var-1;i++)if (x[i])ans[c++]=i+1;if (c<minn){minn=c;for (int i=0;i<=c-1;i++)temp[i]=ans[i];}else if (c==minn){bool flag=false;for (int i=0;i<=c-1;i++)if (temp[i]>ans[i]){flag=true;break;}if (flag)  for (int i=0;i<=c-1;i++)  temp[i]=ans[i];}return;}x[free_x[pos]]=0;dfs(pos+1);x[free_x[pos]]=1;dfs(pos+1);}int main(){int n;int i;scanf("%d",&n);for (i=0;i<=n-1;i++){while (1){int ac;scanf("%d",&ac);if (ac==-1)break;a[ac-1][i]=1;}}for (i=0;i<=n-1;i++)a[i][n]=1;equ=var=n;int g=Gauss();if (g==-1)printf("No solution\n");else if (g==0){c=0;for (i=0;i<=n-1;i++)if (x[i])  temp[c++]=i+1;for (i=0;i<c-1;i++)printf("%d ",temp[i]);printf("%d\n",temp[i]);}else{c=0;dfs(0);for (i=0;i<minn-1;i++)printf("%d ",temp[i]);printf("%d\n",temp[i]);}}


0 0
原创粉丝点击