今天,是我第一天在参加培训后写博客,以后也争取每天一篇博客。
上午比赛完电脑死机了,处理完再交程序的时候,没有点提交,导致第一次没有成绩。好在老师足够和蔼,帮我重测了一下,还重新发了一遍成绩单,好歹也算是有了成绩。
令人震惊的是今天居然是搜索专场,原来搜索题也可以这么毒瘤。
今天成绩:60+10+20。(所有大数据都是输出的rand(),一分没有,怪不得今天洛谷运势凶)
T1
开关灯
【问题描述】
节日宴会上,我们有 N(10<=N<=36)盏彩色灯,他们分别从 1 到 N 被标上号码。有 M 条边连 接着这些灯,当按下某一盏灯的开关的时候,这盏灯本身以及所有和这盏灯有边相连的灯的 开关状态都会发生改变。最开始所有灯都是被关着的,问需要至少按下多少开关,才可以把 所有灯打开。
【输入格式】
输入分 M+1 行,第一行给出整数 N M,接下来 M 行每行两个位于 1 和 N 之间的整数 I 代表二者之间有边相连
【输出格式】
输出一行,表示最小需要的按下开关的次数
【输入样例 1】
5 6 1 2 1 3 4 2 3 4 2 5 5 3
【输出样例 1】
3
【数据规模约定】
对于 60%的数据,有 1≤N≤14。 对于 100%的数据,有 1≤N≤36。
考场上打了一个暴力,暴力bfs,60,但这题数据有锅,第8个点数据错了,本来能过的,所以一共是70分。
题解有两个,一个是高斯消元解异或方程组,但被底下的大佬们用完全图一堆自由元卡爆了,不过还是贴一下题解吧。
用变量 w[i] 表示第i个开关对应的开关的状态,用 x[i] 表示某个灯泡最后的暗灭状态,尝试用 w[i] 和图的邻接矩阵表示 x[i],发现是异或方程组的形式
高斯消元,枚举所有的自由元开关,用异或方程组得到其它开关的状态
另外一个题解是meet in the middle,前一半开关和后一半开关分别计算,用map统计一下答案就好了。
T1AC代码(meet in the middle)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#i