JZOJ 3457. 【NOIP2013模拟联考3】沙耶的玩偶(doll)
题目
分析
- 首先标点,然后跑二分图
- 答案=空格数-最大匹配
代码
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<vector> 5 using namespace std; 6 long long n,m,x,y,ans,link[100001],s[205][205],p,ss; 7 vector<int> f[10001]; 8 bool cover[100001]; 9 int map[100][100],rk[100][100]; 10 bool find(int i) 11 { 12 for (int k=0;k<f[i].size();k++) 13 if (!cover[f[i][k]]) 14 { 15 int j=f[i][k]; 16 cover[j]=true; 17 int q=link[j]; 18 link[j]=i; 19 if (q==0||find(q)) return true; 20 link[j]=q; 21 } 22 return false; 23 } 24 int main() 25 { 26 int n,m,r,c; 27 cin>>n>>m>>r>>c; 28 char num; 29 int fx[4][2]={{r,c},{c,r},{r,-c},{c,-r}}; 30 int cnt=0,tot=0; 31 for (int i=1;i<=n;i++) 32 for (int j=1;j<=m;j++) 33 { 34 cin>>num; 35 if (num=='.') map[i][j]=1,rk[i][j]=++cnt; 36 else tot++; 37 } 38 for (int i=1;i<=n;i++) 39 for (int j=1;j<=m;j++) 40 for (int k=0;k<4;k++) 41 { 42 int ax=i+fx[k][0],ay=j+fx[k][1]; 43 if (ax>n||ay>m||ax<1||ay<1||!map[ax][ay]) continue; 44 f[rk[i][j]].push_back(rk[ax][ay]); 45 } 46 int ans=0; 47 for (int i=1;i<=n;i++) 48 { 49 for (int j=1;j<=m;j++) 50 { 51 if (map[i][j]==1) 52 { 53 memset(cover,0,sizeof(cover)); 54 ans+=find(rk[i][j]); 55 } 56 } 57 } 58 cout<<n*m-tot-ans; 59 }
为何要逼自己长大,去闯不该闯的荒唐