雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

2011年7月20日

摘要: 题意是判断二分图的边是否唯一先最大二分匹配下枚举 A集合的点所连接的边 删除在最大二分匹配下看匹配数是否与没删前一样,若不一样,则说明该边是唯一边View Code #include<stdio.h>#include<string.h>bool map[59][59];int mark[59];int rmark[59];bool flag[59];int m,g;struct data{ int minx,miny,maxx,maxy;}node[59];struct data1{ int x,y;}point[59];struct data2{ char str; 阅读全文

posted @ 2011-07-20 19:26 huhuuu 阅读(165) 评论(0) 推荐(0) 编辑

摘要: 最大独立集: 在N个点的图G中选出m个点,使这m个点两两之间没有边,求m最大值。如果图G满足二分图条件,则可以用二分图匹配来做。最大独立集点数 = N - 最大匹配数。将孩子看成二分图里的 A,B集若孩子a喜欢的动物号是孩子b喜欢的动物号则连边,因为A,B集是同类,无向图map[a][b]=1;map[b][a]=1;实际上就是最大独立集=顶点数-最大匹配数/2View Code #include<stdio.h>#include<string.h>bool map[509][509];int mark[509];bool flag[509];int m;char A[ 阅读全文

posted @ 2011-07-20 15:45 huhuuu 阅读(836) 评论(2) 推荐(0) 编辑

摘要: 裸题。。。View Code #include<stdio.h>#include<string.h>bool map[109][109];int mark[109];bool flag[109];int m;bool dfs(int x){ int i; for(i=1;i<=m;i++) { if(map[x][i]==0||flag[i]) continue; flag[i]=1; if(mark[i]==0||dfs(mark[i])) { mark[i]=x; return 1; } } return 0;}int main(){ int i,g,k,j; 阅读全文

posted @ 2011-07-20 13:52 huhuuu 阅读(145) 评论(0) 推荐(0) 编辑

摘要: 主要难点在与拆点举个例子:3. . .X . X. X .在行上拆成1 1 10 2 03 0 4列上拆成1 3 40 3 02 0 5就行了。。。后面一样View Code #include<stdio.h>#include<string.h>bool map[20][20];int hash[5][5];int row[5][5];int lie[5][5];int mark[20];bool flag[20];int m;bool dfs(int x){ int i; for(i=1;i<=m;i++) { if(map[x][i]==0||flag[i]) 阅读全文

posted @ 2011-07-20 11:10 huhuuu 阅读(175) 评论(0) 推荐(0) 编辑

摘要: 把行列转化为二分图根据König定理:二分图最小点覆盖数 = 最大匹配数View Code #include<stdio.h>#include<string.h>bool map[505][505];int mark[505];bool flag[505];int m;bool dfs(int x){ int i; for(i=1;i<=m;i++) { if(map[x][i]==0||flag[i]) continue; flag[i]=1; if(mark[i]==0||dfs(mark[i])) { mark[i]=x; return 1; } 阅读全文

posted @ 2011-07-20 08:31 huhuuu 阅读(216) 评论(0) 推荐(0) 编辑