随笔分类 - 二分图
图论
摘要:找出若干个环覆盖所有的点,使得总的花费最小因为每个点只能经过一次,所以很快就可想到拆点求最小费用流建图:S->i 费用为0 流量为1i+n->T同上若有边u->vu->v+n 费用为边权,容量为1最后套套模板求一次最小费用流,如果流量等于n,表示每个点都遍历了一次,输出最小费用即可View Code #include <iostream>#include <algorithm>#include <string>#include <stdio.h>#include <string.h>#include <s
阅读全文
摘要:hdu 2768,两个投票者矛盾的话就连一条边,总数减去最大匹配数就是要求的答案#include<cstdio>#include<cstring>#include<string>#include<vector>#include<iostream>using namespace std;bool vis[501];int match[501];vector<int> g[501];string a[505],b[505];bool dfs(int u){ for(int i=0;i<g[u].size();i++) {
阅读全文
摘要:推荐java学习室http://www.java3z.com/cwbwebhome/旧题新做,练java用View Code import java.io.*;import java.util.*;import java.math.*;public class Main{ static int n,m,match[]=new int[210]; static boolean mat[][]=new boolean [210][210],v[]=new boolean[210]; static boolean dfs(int pre) { int i; ...
阅读全文
摘要:简单二分匹配,注意,输出的是n-最大匹配数#include<stdio.h>#include<string.h>#include<math.h>int match[110];bool map[110][110];struct point{ double x,y;}p[110],hole[110];double dis(point a,point b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}bool vis[110];int m;bool dfs(int u){ int i; for(i=
阅读全文
摘要:很明显的二分匹配,只是直接把可以组成的两个正方形的地方连边的话会重复计算,结果是最大匹配数的两倍,但方案不好输出但由于每两个相邻的正方形的(x+y)奇偶性(行和列相加)是不同的,所以,就可以把奇的放左边偶的放右边(或倒过来,都可以)匈牙利之后直接输出匹配数和方案就好了View Code 1 #include<stdio.h> 2 #include<string.h> 3 #include<vector> 4 using namespace std; 5 bool map[110*110]; 6 vector<int> g[10005]; 7 in
阅读全文
摘要:感觉建图复杂度过大啊,但还是AC了。。。View Code 1 #include<stdio.h> 2 #include<string.h> 3 char str[210][1010]; 4 int map[210][210]; 5 int min(int a,int b){return a<b?a:b;} 6 const int inf = 9999999; 7 int n,match[210]; 8 bool sx[210],sy[210]; 9 int lx[210],ly[210]; 10 bool path(int u) 11 { 12 sx[u]=tr
阅读全文
摘要:比如第i个学生是 【a b】那就从i向a至b连边左边是学生,右边是排名二分匹配即可View Code 1 #include<stdio.h> 2 #include<string.h> 3 int map[62][100001]; 4 int match[100010]; 5 bool vis[100010]; 6 int mi,mx; 7 bool dfs(int u) 8 { 9 int i;10 for(i=mi;i<=mx;i++)11 {12 if(map[u][i]&&!vis[i])13 {14 vi...
阅读全文
摘要:View Code int dist[N<<1],mx[N],my[N],m,n;vector<int> map[N];int que[N<<1],head,tail;int bfs(){ int i; head=0;tail=-1; for(i=1;i<=n;i++) if(mx[i]==-1) que[++tail]=i; for(i=0;i<=m+n;i++) dist[i]=0; int flag=0; while(head<=tail) { int u=que[head++]...
阅读全文
摘要:题目告诉你一些距离(两个城市之间)要求每个城市各经过一次,最后回到原地,求出最短需要的距离。思想转换:每个点的入度出度均为1,相当于左边n个城市,右边n个城市,求最优匹配,由最优匹配的性质得,每个点都会在匹配中。相当于一个点出现两次(表达的不太好),即一次入度,一次出度。所以最短的路程便转换为了最优匹配问题。View Code #include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using namespace std;#define MIN(a,b) a&
阅读全文
摘要:View Code #include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using namespace std;#define MIN(a,b) a<b?a:b#define INF 99999999#define MAX 5005int n,match[MAX];bool sx[MAX],sy[MAX];int lx[MAX],ly[MAX],map[MAX][MAX];char str[105][105];bool path(int u){ sx
阅读全文
摘要:讲一讲二分图的知识吧,自己以后也方便复习,(*^__^*) 嘻嘻……基本的一些定理的证明就不再讲了,书上、网上一大堆。。。。学习二分图,首先要知道什么是匹配,其次是最大匹配。最大匹配是关键,是很多情况的原型。学会最大匹配后,就是各种变形已经很多人总结好了,懒得写(*^__^*) 嘻嘻……如下:二分图是这样一个图,它的顶点可以分类两个集合X和Y,所有的边关联在两个顶点中,恰好一个属于集合X,另一个属于集合Y。最大匹配: 图中包含边数最多的匹配称为图的最大匹配。完美匹配:如果所有点都在匹配边上,称这个最大匹配是完美匹配。完全匹配:设X、Y是二分图G的两个部分。若X中每个结点都关联于匹配M中的一条边
阅读全文

浙公网安备 33010602011771号