图论:二分图
文章平均质量分 69
skajre
这个作者很懒,什么都没留下…
展开
-
UVA 11396 Claw Decomposition(二分图判断)
如果一个节点是一个爪的中心,那么他只能与其余三个辅助点相连,那么就可以发现这是一张二分图,X为爪的中心,Y为三个脚,建完图染下色就可以了。Claw Decomposition #include#includeusing namespace std;const int maxn=300+5;int head[maxn*maxn],to[maxn*maxn],Next[maxn*maxn];原创 2017-01-10 10:18:58 · 217 阅读 · 0 评论 -
HDU 1435 Stable Match(稳定婚姻问题)
#include#include#includeusing namespace std;const int maxn=300+5;const double eps=1e-8;int pref[maxn][maxn],order[maxn][maxn],Next[maxn];int future_husband[maxn],future_wife[maxn];queue q;str原创 2017-01-08 11:36:15 · 397 阅读 · 0 评论 -
UVA 1175 Ladies's Choice(稳定婚姻问题)
#include#include#include#includeusing namespace std;const int maxn=1000+5;int pref[maxn][maxn],order[maxn][maxn],Next[maxn];int future_husband[maxn],future_wife[maxn];queue q;void engage(int原创 2017-01-08 10:47:25 · 292 阅读 · 0 评论 -
HDU 2448 Mining Station on the sea(KM算法)
一开始两种放个矩阵里,不知道那里错了,一直调不对,放一个矩阵就好了。#include#include#include#includeusing namespace std;typedef long long LL;const int maxn=200+5;const int inf=(1<<30);int w[maxn][maxn];int lx[maxn],ly[maxn];原创 2017-01-07 21:46:15 · 176 阅读 · 0 评论 -
KM算法O(n^3)模板 hdu2255
#includeusing namespace std;const int maxn=300+5;const int inf=(1<<30);int w[maxn][maxn];int lx[maxn],ly[maxn];int s[maxn],t[maxn];int slack[maxn];int match[maxn];int n;bool find(int i){原创 2017-01-07 15:33:40 · 614 阅读 · 0 评论 -
HDU 2819 Swap(最大二分图匹配)
这题是个难题,X代表行,Y代表列,i-j连边代表第i行的第i列与第j列连边可以使g[I][I]变成1,那么只需要求最大匹配即可。#include#include#includeusing namespace std;const int maxn=100+5;bool line[maxn][maxn],used[maxn],vis[maxn][maxn];int gril[maxn]原创 2017-01-07 14:44:34 · 181 阅读 · 0 评论 -
POJ 1274 The Perfect Stall(最大二分图匹配)
#include#include#includeusing namespace std;const int maxn=200+5;bool line[maxn][maxn],used[maxn];int gril[maxn];int n,m;bool find(int x){ for(int j=1;j<=m;j++) { if(line[x][j原创 2017-01-07 10:20:57 · 152 阅读 · 0 评论 -
HDU 1151 Air Raid(DAG上的最小路径覆盖)
#include#includeusing namespace std;const int maxn=120+5;bool line[maxn][maxn],used[maxn];int gril[maxn];int n;bool find(int x){ for(int j=1;j<=n;j++) { if(line[x][j]==true&&us原创 2017-01-07 09:41:00 · 155 阅读 · 0 评论 -
HDU 1704 rank(floyd闭包+剪枝)
#include#includeusing namespace std;const int maxn=500+5;bool line[maxn][maxn];int n;void floyd(){ for(int k=1;k<=n;k++) { for(int i=1;i<=n;i++) { if(line原创 2017-01-06 21:14:34 · 228 阅读 · 0 评论 -
HDU 1150 Machine Schedule(匈牙利算法)
#include#includeusing namespace std;const int maxn=100+5;bool line[maxn][maxn],used[maxn];int gril[maxn];int n,m,k;bool find(int x) { for(int j=1;j<=m;j++) { if(line[x][原创 2017-01-06 13:06:02 · 246 阅读 · 0 评论 -
POJ Treasure Exploration(DAG最小可相交路径覆盖)
这题一开始题目没看清,一般的最小路径覆盖是不能有重点的,但是这题目有一句You should notice that the roads of two different robots may contain some same point. 说明可以一个点可以经过多个机器人,之前在论文里看到过,这种情况只需用floyd处理一下闭包关系,只用关心是否能到达,而不用关心怎么到达。#include#原创 2017-01-06 19:34:43 · 295 阅读 · 0 评论 -
ZOJ 1576 Marriage is Stable(稳定婚姻问题)
#include#include#include#include#includeusing namespace std;const int maxn=500+5;int pref[maxn][maxn],order[maxn][maxn],Next[maxn];int future_husband[maxn],future_wife[maxn];queue q;map Boy,原创 2017-01-08 12:12:01 · 549 阅读 · 0 评论 -
POJ 3487 The Stable Marriage Problem(稳定婚姻问题)
#include#include#include#include#include#includeusing namespace std;const int maxn=27+5;int pref[maxn][maxn],order[maxn][maxn],Next[maxn];int future_husband[maxn],future_wife[maxn];queue q;原创 2017-01-08 13:11:44 · 603 阅读 · 0 评论 -
HDU 4751 Divide Groups(二分图判断)
给出的图是一张有向图,代表i认识j,那么line[i][j]==false||line[j][i]==false代表i和j不是相互认识,那么他们肯定不可以在一个集合里,所以i和j之间连边,最后判断是不是二分图,如果是,那么可以分,否则不能分。#include#includeusing namespace std;const int maxn=100+5;int head[maxn*maxn原创 2017-01-10 10:06:20 · 205 阅读 · 0 评论 -
HDU 2444 The Accomodation of Students(二分图判断+最大匹配)
#include#includeusing namespace std;const int maxn=200+5;int head[maxn*maxn],to[maxn*maxn],Next[maxn*maxn];bool used[maxn];int match[maxn],color[maxn];;int n,m;int tot;void addedge(int u,int原创 2017-01-10 09:26:53 · 208 阅读 · 0 评论 -
UVA 12168 Cat vs. Dog(最大独立集)
这个看的出来是求最大独立集,但是一开始一直是猫和狗矛盾,用毛和狗在做最大匹配。但是题目要求是最多满足多少人的要求,才发现,是人的最大独立集。#include#includeusing namespace std;const int maxn=500+5;bool line[maxn][maxn],used[maxn];int match[maxn],c,d;struct perso原创 2017-01-09 21:20:04 · 204 阅读 · 0 评论 -
UVA 1327 King's Quest(强联通+二分图)
参考:http://www.cnblogs.com/zxndgv/archive/2011/08/06/2129333.html#include#include#includeusing namespace std;const int N=2000+5;const int M=205000;bool line[N][N],instack[N*2];int n, tot, dep,原创 2017-01-09 20:09:38 · 289 阅读 · 0 评论 -
UVA 1405 The Great Wall Game(最佳二分图匹配)
一开始理所当然的认为横排和纵排应该是横坐标和纵坐标和的平均值,但是WA了好几次。检查了一下,好像也就这么一个可疑点,算算时间复杂度也不会T,就直接暴力了,然后就过了= =。#includeusing namespace std;const int maxn=300+5;const int inf=(1<<30);int w[maxn][maxn],n;int lx[maxn],ly[原创 2017-01-09 16:26:12 · 357 阅读 · 0 评论 -
UVA 10615 Rooks(?)
这题是我碰到的二分图最难,到现在都还没明白怎么回事,先存着吧。#include#include#include#includeusing namespace std;const int maxn=100+5;int n,maxcolor;int color[maxn][maxn],match[maxn],inrow[maxn],incol[maxn];char map[maxn][原创 2017-01-09 15:01:51 · 305 阅读 · 0 评论 -
UVA 1349 Optimal Bus Route Design(KM判环)
#include#includeusing namespace std;const int maxn=100+5;const int inf=(1<<30);int w[maxn][maxn],n;int lx[maxn],ly[maxn];int Left[maxn];bool s[maxn],t[maxn];bool match(int i){ s[i]=true;原创 2017-01-08 20:06:04 · 262 阅读 · 0 评论 -
UVA 1201 Taxi Cab Scheme(最小路径覆盖)
#include#include#includeusing namespace std;const int maxn=500+5;int x1[maxn],y[maxn],x2[maxn],y2[maxn],t1[maxn],t2[maxn];bool line[maxn][maxn],used[maxn];int match[maxn],n;bool find(int i){原创 2017-01-08 19:37:04 · 204 阅读 · 0 评论 -
UVA 12083 Guardian of Decency(最小独立集)
最小独立集=点数-最大匹配。#include#includeusing namespace std;const int maxn=500+5;bool line[maxn][maxn],used[maxn];int match[maxn],n;string sex[maxn],music[maxn],sport[maxn];int h[maxn];bool find(int i)原创 2017-01-08 18:46:58 · 233 阅读 · 0 评论 -
UVA 11419 SAM I AM(二分图最小覆盖+答案输出)
这个板子直接可以用了。#include#include#include#includeusing namespace std;const int maxn=1000+5;struct BPM{ int n,m; vector G[maxn]; int left[maxn];//left[i]为右边第i个点的匹配编号,-1表示不存在 bool T[ma原创 2017-01-08 17:37:42 · 274 阅读 · 0 评论 -
POJ 3020 Antenna Placement(最小边覆盖)
其实应该1A的,有个循环上线写错了。#include#include#includeusing namespace std;const int maxn=500+5;char map[50][50];int id[maxn][maxn];bool line[maxn][maxn],used[maxn*maxn];int gril[maxn*maxn];int m,n;int c原创 2017-01-06 18:57:53 · 175 阅读 · 0 评论 -
SPOJ 4206 Fast Maximum Matching(HK算法)
n到5w了,显然要用邻接链表存图了,把邻接矩阵的改了改,就AC了。#include#include#include#include#includeusing namespace std;const int maxn=50000+5;const int inf=(1<<30);int head[maxn];int cx[maxn],cy[maxn];int nx,ny;int原创 2017-01-06 17:59:54 · 263 阅读 · 0 评论 -
HDU 2389 Rain on your Parade(HK算法)
看这数据量,显然匈牙利算法要超时,就拿了HK的板子上了。#include#include#include#includeusing namespace std;const int maxn=3000+5;struct guest{int x,y,s;}guests[maxn];struct umbrella{int x,y;}umbrellas[maxn];int t,m,n;c原创 2017-01-06 13:35:30 · 188 阅读 · 0 评论 -
HDU 2853 Assignment(最佳二分图匹配)
这题麻烦的是怎么求最小改变原配边数,把所有边的权值乘55,然后原配遍+1,那么最后获得的权值对55取模就是最大权值匹配的二分图中留下来的原配边数量了。#include#includeusing namespace std;const int maxn=50+5;char map[maxn][maxn];int w[maxn][maxn],n,m;int lx[maxn],ly[maxn原创 2017-01-03 12:25:36 · 234 阅读 · 0 评论 -
HDU 2426 Interesting Housing Problem(点集不同最大二分图)
预处理w所有数据为-inf,最后判断就可以了,其他的只要把关于j的n改为m即可,因为点集不同。#include#includeusing namespace std;const int maxn=500+5;char map[maxn][maxn];int w[maxn][maxn],n,m;int lx[maxn],ly[maxn];int Left[maxn];bool s[m原创 2017-01-02 21:30:57 · 240 阅读 · 0 评论 -
HDU 3435 A new Graph Game(最大二分图找最小环权值和)
#includeusing namespace std;const int maxn=1000+5;char map[maxn][maxn];int w[maxn][maxn],n;int lx[maxn],ly[maxn];int Left[maxn];bool s[maxn],t[maxn];bool match(int i){ s[i]=true; for(原创 2017-01-02 15:34:49 · 281 阅读 · 0 评论 -
HDU 3488 Tour(最大二分匹配找最小环权值和)
和1853一样。#includeusing namespace std;const int maxn=200+5;char map[maxn][maxn];int w[maxn][maxn],n;int lx[maxn],ly[maxn];int Left[maxn];bool s[maxn],t[maxn];bool match(int i){ s[i]=true;原创 2017-01-02 15:29:38 · 188 阅读 · 0 评论 -
HDU 1853 Cyclic Tour(最佳二分图匹配寻找图中的环)
我们把任意一个顶点i都分成两个,即i和i’. 如果原图存在i->j的边,那么二分图有i->j’的边.根据这个定理,就会发现一个环恰好是一个完美匹配,KM套上去就可以了。#includeusing namespace std;const int maxn=200+5;char map[maxn][maxn];int w[maxn][maxn],n;int lx[maxn],ly[max原创 2017-01-02 15:24:23 · 332 阅读 · 0 评论 -
HDU 1533 Going Home(最佳二分匹配)
#include#includeusing namespace std;const int maxn=100+5;struct point{int x,y;point(int x=0,int y=0):x(x),y(y) {}};vector st,en;char map[maxn][maxn];int w[maxn][maxn],n;int lx[maxn],ly[maxn];原创 2017-01-02 14:27:23 · 180 阅读 · 0 评论 -
HDU 2255 奔小康赚大钱(最佳二分图匹配)
#includeusing namespace std;const int maxn=300+5;int w[maxn][maxn],n;int lx[maxn],ly[maxn];int Left[maxn];bool s[maxn],t[maxn];bool match(int i){ s[i]=true; for(int j=1;j<=n;j++) if(lx原创 2017-01-02 14:06:51 · 144 阅读 · 0 评论 -
POJ 3545 Ants(最佳二分图匹配)
#include#include#includeusing namespace std;const int maxn=100+5;const double INF=1e30;int n;double w[maxn][maxn];double lx[maxn],ly[maxn];int Left[maxn];bool s[maxn],t[maxn];struct point{i原创 2017-01-02 13:59:02 · 184 阅读 · 0 评论 -
UVA 11383 Golden Tiger Claw(最佳二分图匹配)
#includeusing namespace std;const int maxn=500+5;int w[maxn][maxn],n;int lx[maxn],ly[maxn];int Left[maxn];bool s[maxn],t[maxn];bool match(int i){ s[i]=true; for(int j=1;j<=n;j++) if(lx原创 2017-01-02 12:48:49 · 250 阅读 · 0 评论 -
UVA 1411 Ants(最大二分图匹配)
如果二分图权值最小,那么一定没有相交的线。#include#includeusing namespace std;const int maxn=100+5;const double INF=1e30;int n;double w[maxn][maxn];double lx[maxn],ly[maxn];int Left[maxn];bool s[maxn],t[maxn];st原创 2017-01-02 10:37:15 · 261 阅读 · 0 评论 -
HDU 3718 Similarity(KM算法)
把对应位置的字母边练起来,权值加一,最后求二分图最大权值即可。#include#includeusing namespace std;const int maxn=30+5;int w[maxn][maxn],n,m;int lx[maxn],ly[maxn];int Left[maxn];bool s[maxn],t[maxn];char ss[35][20005];char原创 2017-01-03 14:34:07 · 232 阅读 · 0 评论 -
HDU 3722 Card Game(KM算法)
一开始数组开小了,T了很久,后来发现自回路的时候忘记加continue,又WA了很久,这水题浪费这么多时间= =。#include#includeusing namespace std;const int maxn=200+5;int w[maxn][maxn],n,m;int lx[maxn],ly[maxn];int Left[maxn];bool s[maxn],t[maxn]原创 2017-01-03 15:08:03 · 223 阅读 · 0 评论 -
HDU 1281 棋盘游戏(匈牙利算法)
这题目读了半天没读懂,看了网上的分析才恍然大悟。#include#includeusing namespace std;const int maxn=100+5;bool line[maxn][maxn],used[maxn];int gril[maxn];int n,m,k;bool find(int x) { for(int j=1;j<=m;j++)原创 2017-01-06 13:00:42 · 195 阅读 · 0 评论 -
POJ 2446 Chessboard(匈牙利算法)
这题的构图其实很好像,但是我一开始构图的时候忘记把find函数的寻找范围修改了,WA了好久。#include#include#includeusing namespace std;const int maxn=1200+5;bool line[maxn][maxn],used[maxn];int gril[maxn],map[maxn][maxn];int k,m,n;int原创 2017-01-06 10:31:17 · 222 阅读 · 0 评论