Central heating
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 614   Accepted: 286

Description

Winter has come, but at the Ural State University heating is not turned on yet. There's one little problem: the University is heated only if all of the valves are opened. There are some technicians at the University. Each of them is responsible for one or more valves. There may be several technicians responsible for the same valve. When a technician gets an instruction to turn on the heating he goes round all of his valves and turns them. It means that if a valve was opened then he closes it, and if it was closed then he opens it. It is well known that every technician earns his money not in vain so it's impossible to replace any technician by any combination of other technicians. 
Your task is to determine who of the technicians is to get an instruction "to turn on the heating" in order to heat all the Ural State University. Note that there are N technicians and N valves at the University (1 <= N <= 250). 

Input

The first line of an input contains the number N. The next N lines contain lists of the valves in charge of each of the technicians. It means that a line number i + 1 contains numbers of the valves that the i-th technician is responsible for. Each list of valves is followed by –1.

Output

An output should contain a list of technicians' numbers sorted in ascending order. If several lists are possible, you should send to an output the shortest one. If it's impossible to turn on the heating at the University, you should write "No solution" .

Sample Input

4
1 2 -1
2 3 4 -1
2 -1
4 -1

Sample Output

1 2 3

Source

原题大意: 有n个人,n个阀门。给n组数,每i组一-1结束,代表第i个人管理这组数中正数编号的阀门。
              问:能否确定几个人,使得所有阀门都开着。
解题思路: 不知道为啥是高斯消元,明明线性代数用的比较多。
              由于同一个人,开偶数次与不开是一样的,开奇数次与开1次是一样的。
              于是对于一个人,只有两种情况,不开和开一次。
              既然如此,我们可以把每个人的状态做成n维列向量,再做成增广矩阵,如题中所示。
             1  0  0  0  |  1
             1  1  1  0  |  1
             0  1  0  0  |  1
             0  1  0  1  |  1
             这样,解这个增广矩阵就可以了。
             值得一提的是,原文中有 it's impossible to replace any technician by any combination of other technicians. 
             什么意思呢,也就是说,这个系数矩阵分成向量后是线性无关的。
             也就是说,系数矩阵是n!必定有唯一的解。于是就可以无视原题中的无解和多解情况了。
#include<stdio.h>
#include<string.h>
int a[270][270],ans[270],n;
void swap(int *a,int *b)
{
int cnt=0,c[270],i;
for(cnt=1;cnt<=n+1;++cnt)
{
c[cnt]=*a;
*a++=*(b+cnt-1);
}
for(i=1;i<=n+1;++i) *b++=c[i];
}
void XOR(int col,int *a,int *b)
{
int i;
for(i=col;i<=n+1;++i) *b++^=*a++;
}
void init()
{
int col=0,x,i;
for(i=1;i<=n;++i) a[i][n+1]=1;
for(col=1;col<=n;++col) while(~scanf("%d",&x)&&x!=-1) a[x][col]=1;
}
void solved()
{
int col,row,node;
for(col=1;col<=n;++col)
{
node=0;
for(row=col;row<=n;++row)
{
if(a[row][col])
{
node=row;
break;
}
}
if(node) swap(a[node]+1,a[col]+1);
for(row=col+1;row<=n;++row)
if(a[row][col]) XOR(col,a[col]+col,a[row]+col);
}
}
void target()
{
int i,j;
for(i=n;i>=1;--i)
{
ans[i]=a[i][n+1];
for(j=n-1;j>=1;--j) a[j][n+1]^=(ans[i] & a[j][i]);
}
int first=1;
for(i=1;i<=n;++i) if(ans[i]) printf("%d ",i);
printf("\n");
}
int main()
{
int t,x,col=0;
scanf("%d",&n);
init();
solved();
target();
return 0;
}

  

             

[高斯消元] POJ 2345 Central heating的更多相关文章

  1. poj 2345 Central heating

    Central heating Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 678   Accepted: 310 Des ...

  2. POJ 2345 Central heating(高斯消元)

    [题目链接] http://poj.org/problem?id=2345 [题目大意] 给出n个开关和n个人,每个人可以控制一些开关,现在所有的开关都是关着的 一个指令可以让一个人掰动所有属于他控制 ...

  3. 数学 --- 高斯消元 POJ 1830

    开关问题 Problem's Link: http://poj.org/problem?id=1830 Mean: 略 analyse: 增广矩阵:con[i][j]:若操作j,i的状态改变则con[ ...

  4. 【POJ】2947 Widget Factory(高斯消元)

    http://poj.org/problem?id=2947 各种逗啊..还好1a了.. 题意我就不说了,百度一大把. 转换为mod的方程组,即 (x[1,1]*a[1])+(x[1,2]*a[2]) ...

  5. POJ 1681---Painter's Problem(高斯消元)

    POJ   1681---Painter's Problem(高斯消元) Description There is a square wall which is made of n*n small s ...

  6. POJ 3185 The Water Bowls(高斯消元-枚举变元个数)

    题目链接:http://poj.org/problem?id=3185 题意:20盏灯排成一排.操作第i盏灯的时候,i-1和i+1盏灯的状态均会改变.给定初始状态,问最少操作多少盏灯使得所有灯的状态最 ...

  7. 【POJ 1830】 开关问题 (高斯消元)

    开关问题   Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为 ...

  8. POJ 1222 EXTENDED LIGHTS OUT(高斯消元)

    [题目链接] http://poj.org/problem?id=1222 [题目大意] 给出一个6*5的矩阵,由0和1构成,要求将其全部变成0,每个格子和周围的四个格子联动,就是说,如果一个格子变了 ...

  9. POJ 1222 EXTENDED LIGHTS OUT(高斯消元)题解

    题意:5*6的格子,你翻一个地方,那么这个地方和上下左右的格子都会翻面,要求把所有为1的格子翻成0,输出一个5*6的矩阵,把要翻的赋值1,不翻的0,每个格子只翻1次 思路:poj 1222 高斯消元详 ...

随机推荐

  1. Poj2186Popular Cows

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 31533   Accepted: 12817 De ...

  2. 22-React JSX语法

    React JSX语法 JSX只是一个语法糖,每一个XML标签都会被JSX转换工具转换成纯Javascript代码,当然你想直接使用纯Javascript代码写也是可以的,只是利用JSX,组件的结构和 ...

  3. JAVA程序操作hbase的Maven配置pom.xml文件

    由于工作需要,用到Java连接Hbase读写数据.原来的方式是直接将依赖的jar包全部下载下来,然后工程里面引用. 现想重构下,改为使用Maven管理,遇到了各种坑,各种不好使,特总结下. <d ...

  4. Android 开机自启服务

    package com.example.lenovo.guangbo; import android.app.Service; import android.content.Intent; impor ...

  5. TryUpdateModel

    MSDN参考 https://msdn.microsoft.com/zh-cn/library/system.web.mvc.controller.tryupdatemodel.aspx 相关博文 h ...

  6. nginx缓冲区优化

    关于缓冲, 主要是合理设置缓冲区大小, 尽量避免缓冲到硬盘时的情况 proxy_buffering proxy_buffering这个参数用来控制是否打开后端响应内容的缓冲区,如果这个设置为off,那 ...

  7. 需求:输入一个年份和月份 ,显示当前月日情况 ,星期数要对应准确 * 1.1900年1月1号开始 * 2.星期 : 直接用总天数对7求余数 31 28 59 / 7 = 5 * 3.以\t来个开

    public class Demo4 { /** * @param args */ public static void main(String[] args) { // TODO Auto-gene ...

  8. C# java MD5加密方不一致问题

    说来惭愧,做开发几年了,一直在吸取,今天也写写自已关于技术的一点点理解,不正之处,请大家多多指点. 由于之前开发的项目使用的是C#,用户信息使用的C#的MD5加密码方式,而现在需要切换到Java平台下 ...

  9. white-space: nowrap 与字符串(文本)换行

    在需要对字符串进行元素内换行时,我们通常要对该元素设置相关属性约束以及宽度. 例如:style="word-wrap:break-word; word-break: break-all; w ...

  10. TOEFL备考计划

    一.总则: 1.坚持每一天,充分利用一切可以利用的时间学英语.没有持之以恒的学习和大量的时将做保障,一切都是空谈. 2.每天听写一篇文章,以此文章为中心,展开一天的学习. OG, TOP 3.听说读写 ...