POJ 2345

View Code
  1 //Result:wizmann    2345    Accepted    984K    250MS    G++    1302B
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cstdlib>
  5 #include <iostream>
  6 #include <algorithm>
  7 
  8 using namespace std;
  9 
 10 #define print(x) cout<<x<<endl
 11 #define input(x) cin>>x
 12 #define SIZE 256
 13 
 14 int mat[SIZE][SIZE];
 15 int ans[SIZE];
 16 int n;
 17 
 18 int main()
 19 {
 20     while(input(n))
 21     {
 22         memset(mat,0,sizeof(mat));
 23         memset(ans,0,sizeof(ans));
 24         int t;
 25         for(int i=1;i<=n;i++)
 26         {
 27             while(input(t) && t!=-1)
 28             {
 29                 mat[t][i]=1;
 30             }
 31             mat[i][n+1]=1;
 32         }
 33         /*
 34          * Sample Input
 35          * 4
 36          * 1 2 -1
 37          * 2 3 4 -1
 38          * 2 -1
 39          * 4 -1
 40          * 
 41          * =>
 42          *  Light  | Status
 43          * 1 0 0 0 |    1
 44          * 1 1 1 0 |    1
 45          * 0 0 1 0 |    1
 46          * 0 0 0 1 |    1
 47          */
 48          
 49         for(int i=1;i<=n;i++)
 50         {
 51             int pos=-1;
 52             for(int j=i;j<=n;j++)
 53             {
 54                 if(mat[j][i]){pos=j;break;}
 55             }
 56             for(int j=i;j<=n+1;j++)
 57             {
 58                 swap(mat[i][j],mat[pos][j]);
 59             }
 60 
 61             
 62             for(int j=i+1;j<=n;j++)
 63             {
 64                 if(mat[j][i]==1)
 65                 {
 66                     for(int k=i;k<=n+1;k++)
 67                     {
 68                         mat[j][k]^=mat[i][k];
 69                     }
 70                 }
 71             }
 72         }
 73         
 74         for(int i=n;i>=1;i--)
 75         {
 76             ans[i]=mat[i][n+1];
 77             for(int j=i-1;j>=1;j--)
 78             {
 79                 mat[j][n+1]^=(ans[i]*mat[j][i]);
 80             }
 81         }
 82         bool flag=true;
 83         for(int i=1;i<=n;i++)
 84         {
 85             if(ans[i])
 86             {
 87                 if(flag)
 88                 {
 89                     printf("%d",i);
 90                     flag=false;
 91                 }
 92                 else printf(" %d",i);
 93             }
 94         }
 95         if(flag) puts("No solution");
 96         else puts("");
 97     }
 98     return 0;
 99 }
100             

转载于:https://www.cnblogs.com/Wizmann/archive/2012/04/12/2443715.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值