CodeForces 116B【二分匹配】
2017-03-20 22:29
351 查看
思路:
暴力。。我不会呀。。
YY一个二分匹配嘛,然后数组开小了。GG for an hour.
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int cy[110];
int cx[110];
int n,m;
char ma[15][15];
int g[15][15];
int mma[110][110];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,-1,1};
bool vis[110];
int findpath(int u)
{
for(int i=1;i<=m;i++)
{
if(!vis[i]&&mma[u][i])
{
vis[i]=1;
if(cy[i]==-1||findpath(cy[i]))
{
cy[i]=u;
cx[u]=i;
return 1;
}
}
}
return 0;
}
int main()
{
int x,y;
n=m=0;
memset(g,0,sizeof(g));
scanf("%d%d",&x,&y);
for(int i=0;i<x;i++)
{
scanf("%s",ma[i]);
for(int j=0;j<y;j++)
{
if(ma[i][j]=='P')
g[i][j]=++m;
if(ma[i][j]=='W')
g[i][j]=++n;
}
}
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
{
if(ma[i][j]=='W')
{
int ss=g[i][j];
for(int k=0;k<4;k++)
{
int xx=i+dx[k];
int yy=j+dy[k];
if(xx<0||yy<0||xx>=x||yy>=y)
continue;
if(ma[xx][yy]=='P')
{
int tt=g[xx][yy];
mma[ss][tt]=1;
}
}
}
}
}
memset(cx,-1,sizeof(cx));
memset(cy,-1,sizeof(cy));
int ans=0;
for(int i=1;i<=n;i++)
{
if(cx[i]==-1)
{
memset(vis,0,sizeof(vis));
ans+=findpath(i);
}
}
printf("%d\n",ans);
return 0;
}
/*
3 10
WPPP...PP.
.P...WW..W
.WWP.PP.PW
*/
暴力。。我不会呀。。
YY一个二分匹配嘛,然后数组开小了。GG for an hour.
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int cy[110];
int cx[110];
int n,m;
char ma[15][15];
int g[15][15];
int mma[110][110];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,-1,1};
bool vis[110];
int findpath(int u)
{
for(int i=1;i<=m;i++)
{
if(!vis[i]&&mma[u][i])
{
vis[i]=1;
if(cy[i]==-1||findpath(cy[i]))
{
cy[i]=u;
cx[u]=i;
return 1;
}
}
}
return 0;
}
int main()
{
int x,y;
n=m=0;
memset(g,0,sizeof(g));
scanf("%d%d",&x,&y);
for(int i=0;i<x;i++)
{
scanf("%s",ma[i]);
for(int j=0;j<y;j++)
{
if(ma[i][j]=='P')
g[i][j]=++m;
if(ma[i][j]=='W')
g[i][j]=++n;
}
}
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
{
if(ma[i][j]=='W')
{
int ss=g[i][j];
for(int k=0;k<4;k++)
{
int xx=i+dx[k];
int yy=j+dy[k];
if(xx<0||yy<0||xx>=x||yy>=y)
continue;
if(ma[xx][yy]=='P')
{
int tt=g[xx][yy];
mma[ss][tt]=1;
}
}
}
}
}
memset(cx,-1,sizeof(cx));
memset(cy,-1,sizeof(cy));
int ans=0;
for(int i=1;i<=n;i++)
{
if(cx[i]==-1)
{
memset(vis,0,sizeof(vis));
ans+=findpath(i);
}
}
printf("%d\n",ans);
return 0;
}
/*
3 10
WPPP...PP.
.P...WW..W
.WWP.PP.PW
*/
相关文章推荐
- Codeforces 387D George and Interesting Graph【思维+二分匹配】
- CodeForces 468B Two Sets 二分匹配
- [Codeforces 808F] [二分] [最小割] Card Game
- CodeForces 589F 二分答案
- hihocoder1393 网络流之二分图多重匹配
- Codeforces 645C:Enduring Exodus (二分+前缀和)
- HDU-1281(二分匹配_必要边)
- Codeforces 361D Levko and Array(二分)(DP)
- hdu 1045Fire Net (建图 、二分匹配)
- hdu 1151 Air Raid (二分匹配)
- LA 3126 二分匹配---DAG中的最小路径应用
- POJ 2289 - Jamie's Contact Groups 二分+二分图的多重匹配
- hdu1281 棋盘游戏(二分匹配+行列匹配)
- Codeforces 706B:Interesting drink(二分+排序)
- 【二分匹配】 UVALive 6525 Attacking rooks
- Codeforces 483B Friends and Presents(二分+数论)
- SGU 286 Ancient decoration(Euler路径+二分匹配)
- 【codeforces 782B】The Meeting Place Cannot Be Changed(二分)
- 关于匈牙利算法+二分匹配和KM算法的链接
- hdu3829 二分匹配 最大独立集