摘要:
题意:会给出M个串,我们要做的就是将这M个串给清除了。对于任意两个串,若二进制形式只有一位不一样,那么这两个串可以在一次操作消除,否则每个操作只能消除一个串。3 3*01100011可以代表的串是001101100011那么我们可以先用 10*把 101 和 100 消除了,再用 0*1把001 和 011 消除了。故操作次数为 2。解题思路:我们可以将所有的串先化为整数,并去重。然后对二进制形式只有一位不一样的两个数,我们由含有偶数个1的数向含有奇数个1的数连边,这样就确保了一定是二分图,因为不存在同含奇数个1或同含偶数个1 的数只相差一位。最后进行求最大匹配,既是我们可以省去的操作数。所以 阅读全文
摘要:
思路:如果我们将认识的建边,求最大独立集就是互相不认识的人数。那么我们反过来,将不认识的建图,求最大独立集就是互相认识的人数。#include#include#include#include#define Maxn 210int graphic[Maxn][Maxn],vi[Maxn],match[Maxn],n,m;int dfs(int u){ int i; for(i=1;i<=m;i++) { if(!vi[i]&&graphic[u][i]) { vi[i]=1; if(match[i]==-1... 阅读全文
摘要:
#include#include#include#include#define N 2000#define M 1000010#define inf 1=n)return flow-lv; if(lv==0) break; } if(d[v]>1; memset(index,-1,sizeof(index)); for(i=1;in)建立一个流量为1的边,从每个人向每个他从属的组织建立一条流量为1的边,在由每个组织建立一条流向汇点的边,我们可以二分枚举组织向汇点边的流量。 阅读全文
摘要:
思路:由(i+j)为偶数的点向(i+j)为奇数的点建边。求一次最大匹配,若正好为空格数(不包含洞)的一半,即输出YES。#include#include#include#include#define Maxn 1101using namespace std;int n,m,vi[Maxn],match[Maxn],graphic[Maxn][Maxn],map[40][40],N[Maxn],M[Maxn],x,y;int dfs(int u){ int i; for(i=1;i<=y;i++) { if(!vi[M[i]]&&graphic[u][M[i]])... 阅读全文
摘要:
就是最简单的最大匹配,没的说#include#include#include#include#define Maxn 310using namespace std;int n,m,vi[Maxn],match[Maxn],graphic[Maxn][Maxn];int dfs(int u){ int i; for(i=1;i<=m;i++) { if(!vi[i]&&graphic[u][i]) { vi[i]=1; if(match[i]==-1||dfs(match[i])) {... 阅读全文
摘要:
思路:我们首先来一遍拓扑排序,将点按先后顺序排列于一维数组中,然后扫描一遍数组,将每个点的出边所连接的点进行更新,即可得到最优解。#include#include#include#include#include#define inf 2000000010#define Maxn 100010#define Maxm 1000010using namespace std;int dist[Maxn],vi[Maxn],index[Maxn],e,value[Maxn],indegree[Maxn],outdegree[Maxn],ans[Maxn],num,n;struct Edge{ i... 阅读全文