zoj 1654 中等二分匹配
2013-12-14 20:06
579 查看
解法1:我们可以把每个空地看成一个点 , 然后把所有有关联的空地之间连一条边 , 再求所得到的图的最大独立集 ,
但是最大独立集是一个NP问题 , 因此并没有有效的算法 , 来求出这个。
解法2:分别把每一行、每一列看成是一个状态 , 最后求最大匹配
代码:
#include
#include
#include
#include
using namespace std;
#define maxn 2600
char ky[52][52];
int xs[52][52] , ys[52][52];
int pre[maxn] , cy[maxn];
vectorgrap[maxn];
int n , m;
void init()
{
for(int i =
1; i <= 2500 ; i++)
grap[i].clear();
memset(cy ,
-1 , sizeof(cy));
memset(xs ,
0 , sizeof(xs));
memset(ys ,
0 , sizeof(ys));
}
int path(int u)
{
for(int i =
0; i < grap[u].size() ; i++)
{
int v =
grap[u][i];
if(!pre[v])
{
pre[v] =
1;
if(cy[v] ==
-1 || path(cy[v]))
{
cy[v] =
u;
return
1;
}
}
}
return
0;
}
int maxmatch()
{
int res =
0;
memset(cy ,
-1 , sizeof(cy));
for(int i =
1; i <= n; i++)
{
memset(pre ,
0 , sizeof(pre));
res +=
path(i);
}
return
res;
}
int main()
{
int t;
cin>>t;
int gh =
1;
while(t--)
{
int x ,
y;
init();
printf("Case
:%d\n" , gh++);
scanf("%d
%d" , &x , &y);
int i , j ,
g , h;
for(i = 0; i
< x; i++)
scanf("%s" ,
ky[i]);
n = 1 , m =
1;
h = 0;
for(i = 0; i
< x; i++)
{
g = 0;
for(j = 0; j
< y; j++)
但是最大独立集是一个NP问题 , 因此并没有有效的算法 , 来求出这个。
解法2:分别把每一行、每一列看成是一个状态 , 最后求最大匹配
代码:
#include
#include
#include
#include
using namespace std;
#define maxn 2600
char ky[52][52];
int xs[52][52] , ys[52][52];
int pre[maxn] , cy[maxn];
vectorgrap[maxn];
int n , m;
void init()
{
for(int i =
1; i <= 2500 ; i++)
grap[i].clear();
memset(cy ,
-1 , sizeof(cy));
memset(xs ,
0 , sizeof(xs));
memset(ys ,
0 , sizeof(ys));
}
int path(int u)
{
for(int i =
0; i < grap[u].size() ; i++)
{
int v =
grap[u][i];
if(!pre[v])
{
pre[v] =
1;
if(cy[v] ==
-1 || path(cy[v]))
{
cy[v] =
u;
return
1;
}
}
}
return
0;
}
int maxmatch()
{
int res =
0;
memset(cy ,
-1 , sizeof(cy));
for(int i =
1; i <= n; i++)
{
memset(pre ,
0 , sizeof(pre));
res +=
path(i);
}
return
res;
}
int main()
{
int t;
cin>>t;
int gh =
1;
while(t--)
{
int x ,
y;
init();
printf("Case
:%d\n" , gh++);
scanf("%d
%d" , &x , &y);
int i , j ,
g , h;
for(i = 0; i
< x; i++)
scanf("%s" ,
ky[i]);
n = 1 , m =
1;
h = 0;
for(i = 0; i
< x; i++)
{
g = 0;
for(j = 0; j
< y; j++)
相关文章推荐
- poj 3207 简单的2-SAT问题
- 求强连通分量几种算法的比较
- poj 2762 判断有向图是…
- poj 2553
- poj 3592 有点难度的强…
- 关于求割点代码的一些细节处
- 关于无向图中连通分量缩点的问题
- Reverse Linked List II
- poj 1658 简单的Havel-H…
- poj 3694 中等难度的双…
- poj 3177 有点难度的边-双连通
- zoj 2588 简单的双连通分量
- poj 1144 求图的割点
- poj 1386 欧拉图的应用
- poj 1300 简单的欧拉图…
- 女眞關係
- poj 3159 差分约束+最短…
- poj 2983 中等的差分约束
- zoj 2770 差分约束的应用及其原理
- poj 1734 Floyd算求有向图的最小环