题意:

给你n个人m条关系

每条关系包括a,b

代表a和b能够是线上朋友也能够是线下朋友

然后保证每一个人的线上朋友数和线下朋友数相等

问你有多少种组成方法

思路:

官方题解是爆搜+剪枝,然而并不会写。

比赛的时候想到用高斯消元来剪枝

最后枚举自由元

由于关系的话到了最后肯定有些关系是确定的。

这样一定会消掉一些部分

最后G++AC C++TLE。

代码:

#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"queue"
#include"algorithm"
#include"iostream"
using namespace std;
int equ,var;
int x[55],du[55];
int a[55][55];
int nofree_num;
int gcd(int x,int y)
{
return y? gcd(y,x%y):x;
}
int lcm(int x,int y)
{
return x/gcd(x,y)*y;
}
void debug()
{
for(int i=0; i<equ; i++)
{
for(int j=0; j<=var; j++) printf("%d ",a[i][j]);
puts("");
}
puts("");
}
int dfs(int p)
{
int ans=0;
if(p<nofree_num)
{
int i,j;
for(i=nofree_num-1; i>=0; i--)
{
int tep=a[i][var];
for(j=i+1; j<var; j++) tep=tep-(x[j]*a[i][j]);
if(tep%a[i][i]!=0) return 0;
x[i]=tep/a[i][i];
}
for(i=0; i<equ; i++) if(x[i]!=1 && x[i]!=-1) return 0;
return 1;
}
x[p]=-1;
ans+=dfs(p-1);
x[p]=1;
ans+=dfs(p-1);
return ans;
}
int gauss()
{
int i,j,k;
int row,col;
for(row=0,col=0; row<equ&&col<var; row++,col++)
{
int maxr=row;
for(i=row+1; i<equ; i++) if(abs(a[i][col])>abs(a[maxr][col])) maxr=i;
if(a[maxr][col]==0)
{
row--;
continue;
}
for(i=0; i<=var; i++) swap(a[row][i],a[maxr][i]);
for(i=row+1; i<equ; i++)
{
if(a[i][col])
{
int LCM=lcm(abs(a[row][col]),abs(a[i][col]));
int ta=LCM/abs(a[row][col]);
int tb=LCM/abs(a[i][col]);
if(a[i][col]*a[row][col]<0) ta=-ta;
for(j=col; j<=var; j++)
a[i][j]=(a[i][j]*tb)-(a[row][j]*ta);
}
}
}
for(i=row; i<equ; i++) if(a[i][var]) return 0;
for(i=0; i<equ; i++)
{
if(a[i][i]==0)
{
for(j=i+1; j<var; j++) if(a[i][j]) break;
if(j==var) break;
for(k=0; k<equ; k++) swap(a[k][i],a[k][j]);
}
}
nofree_num=row;
//debug();
if(var-nofree_num)
{
return dfs(var-1);
}
for(i=row-1; i>=0; i--)
{
int tep=a[i][var];
for(j=i+1; j<var; j++) tep=tep-(x[j]*a[i][j]);
if(tep%a[i][i]!=0) return 0;
x[i]=(tep/a[i][i]);
if(x[i]!=1 && x[i]!=-1) return 0;
}
return 1;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
equ=m;
var=m;
memset(a,0,sizeof(a));
memset(du,0,sizeof(du));
for(int i=0; i<m; i++)
{
int x,y;
scanf("%d%d",&x,&y);
du[x]++;
du[y]++;
a[x-1][i]=1;
a[y-1][i]=1;
}
int ff=1;
for(int i=1;i<=n;i++)
{
if(du[i]%2)
{
ff=0;
break;
}
}
if(ff==0)
{
puts("0");
continue;
}
// debug(); int ans=gauss();
printf("%d\n",ans);
}
return 0;
}

[多校2015.02.1006 高斯消元] hdu 5305 Friends的更多相关文章

  1. 2014多校第一场J题 || HDU 4870 Rating(DP || 高斯消元)

    题目链接 题意 :小女孩注册了两个比赛的帐号,初始分值都为0,每做一次比赛如果排名在前两百名,rating涨50,否则降100,告诉你她每次比赛在前两百名的概率p,如果她每次做题都用两个账号中分数低的 ...

  2. 2015南阳CCPC E - Ba Gua Zhen 高斯消元 xor最大

    Ba Gua Zhen Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 无 Description During the Three-Kingdom perio ...

  3. UVALive 7138 The Matrix Revolutions(Matrix-Tree + 高斯消元)(2014 Asia Shanghai Regional Contest)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...

  4. HDU 4870 Rating(高斯消元 )

    HDU 4870   Rating 这是前几天多校的题目,高了好久突然听旁边的大神推出来说是可以用高斯消元,一直喊着赶快敲模板,对于从来没有接触过高斯消元的我来说根本就是一头雾水,无赖之下这几天做DP ...

  5. 高斯消元 & 线性基【学习笔记】

    高斯消元 & 线性基 本来说不写了,但还是写点吧 [update 2017-02-18]现在发现真的有好多需要思考的地方,网上很多代码感觉都是错误的,虽然题目通过了 [update 2017- ...

  6. 【 HDU 4936 】Rainbow Island (hash + 高斯消元)

    BUPT2017 wintertraining(15) #5B HDU - 4936 2014 Multi-University Training Contest 7 F 题意 直接看官方的题意和题解 ...

  7. HDU 4870 Rating (高斯消元)

    题目链接  2014 多校1 Problem J 题意  现在有两个账号,初始$rating$都为$0$,现在每次打分比较低的那个,如果进前$200$那么就涨$50$分,否则跌$100$分.   每一 ...

  8. 【bzoj4031】[HEOI2015]小Z的房间 Matrix-Tree定理+高斯消元

    [bzoj4031][HEOI2015]小Z的房间 2015年4月30日3,0302 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的 ...

  9. 【BZOJ-3143】游走 高斯消元 + 概率期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status] ...

随机推荐

  1. 长沙理工大学第十二届ACM大赛-重现赛 L - 选择困难症

    题目描述 小L有严重的选择困难症. 早上起床后,需要花很长时间决定今天穿什么出门. 假设一共有k类物品需要搭配选择,每类物品的个数为Ai,每个物品有一个喜欢值Vj,代表小L对这件物品的喜欢程度. 小L ...

  2. 关于 Unity 项目中的 Mono 堆内存泄露

    关于 Unity 项目中的 Mono 堆内存泄露 题记:这是补一篇应该在将近一年前就应该写的记录,今天终于补上. 内存泄露是一个老话题了,之前我专门写过一篇 排查 Lua 虚拟机内存泄露 的文章,并且 ...

  3. django celery(QQ蓝鲸)

    官方:http://www.celeryproject.org 文档:http://docs.jinkan.org/docs/celery/index.html FAQ:http://docs.cel ...

  4. 【BZOJ 4665】 4665: 小w的喜糖 (DP+容斥)

    4665: 小w的喜糖 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 94  Solved: 53 Description 废话不多说,反正小w要发喜 ...

  5. JZYZOJ1998 [bzoj3223] 文艺平衡树 splay 平衡树

    http://172.20.6.3/Problem_Show.asp?id=1998 平衡树区间翻转的板子,重新写一遍,给自己码一个板子. #include<iostream> #incl ...

  6. BZOJ 3231: [Sdoi2008]递归数列 (JZYZOJ 1353) 矩阵快速幂

    http://www.lydsy.com/JudgeOnline/problem.php?id=3231   和斐波那契一个道理在最后加一个求和即可 #include<cstdio> #i ...

  7. Java并发(十六):并发工具类——Exchanger

    Exchanger(交换者)是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交换.它提供一个同步点,在这个同步点两个线程可以交换彼此的数据.这两个线程通过exchange方法交换数 ...

  8. CROC 2016 - Elimination Round (Rated Unofficial Edition) D. Robot Rapping Results Report 二分+拓扑排序

    D. Robot Rapping Results Report 题目连接: http://www.codeforces.com/contest/655/problem/D Description Wh ...

  9. poj 2828 buy Tickets 用线段树模拟带插入的队列

    Buy Tickets Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2 ...

  10. 1036: [ZJOI2008]树的统计Count (树链剖分)

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3401  Solved: 1418[Submit] ...