| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
随手一个匈牙利神奇AC,求解释#include <iostream>
using namespace std;
int t,n,m;
bool g[42][42];
bool b[42][42];
int px[4]={0,0,1,-1};
int py[4]={1,-1,0,0};
int prex[42][42];
int prey[42][42];
bool find(int x,int y)
{
for (int p=0;p<4;p++)
{
int xx=x+px[p],yy=y+py[p];
if (g[xx][yy]&&!b[xx][yy])
{
b[xx][yy]=true;
if (!prex[xx][yy]||find(prex[xx][yy],prey[xx][yy]))
{
prex[xx][yy]=x;
prey[xx][yy]=y;
return true;
}
}
}
return false;
}
int main()
{
cin>>t;
while (t--)
{
cin>>n>>m;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
char c;
cin>>c;
g[i][j]=c=='*';
}
for (int i=1;i<=n;i++) g[i][0]=g[i][m+1]=false;
for (int j=1;j<=m;j++) g[0][j]=g[n+1][j]=false;
int count=0;
memset(prex,0,sizeof(prex));
memset(prey,0,sizeof(prey));
int s=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
if (g[i][j])
{
s++;
memset(b,0,sizeof(b));
if (find(i,j)) count++;
}
cout<<(s*2-count)/2<<endl;//为何这样能算出答案?
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator