首页 > 代码库 > HDU 4185
HDU 4185
http://acm.hdu.edu.cn/showproblem.php?pid=4185
两个挨着的‘#‘可以配成一对,求最多能配成几对
挨着的‘#‘就连边,然后求一次最大匹配,答案是最大匹配除以二(因为1 2和2 1这两对匹配实际效果是1,但是会算成2)
#include <iostream>#include <cstdio>#include <cstring>using namespace std ;struct node{ int s,t,nxt ; }e[500005] ;int m,n,head[500005],cnt,match[500005],vis[500005] ;int find(int s){ for(int i=head[s] ;i!=-1 ;i=e[i].nxt) { int tt=e[i].t ; if(!vis[tt]) { vis[tt]=1 ; if(match[tt]==-1 || find(match[tt])) { match[tt]=s ; return 1 ; } } } return 0 ;}int max_match(){ int ans=0 ; memset(match,-1,sizeof(match)) ; for(int i=1 ;i<=m ;i++) { memset(vis,0,sizeof(vis)) ; ans+=find(i); } return ans;}void add(int s,int t) {e[cnt].s=s ;e[cnt].t=t ;e[cnt].nxt=head[s] ;head[s]=cnt++ ;}char M[605][605] ;int mp[605][605] ;int dx[]={1,-1,0,0} ;int dy[]={0,0,1,-1} ;int main(){ int T ; scanf("%d",&T) ; for(int cas=1 ;cas<=T ;cas++) { int N ; scanf("%d",&N) ; for(int i=0 ;i<N ;i++) scanf("%s",M[i]) ; n=0 ; memset(mp,0,sizeof(mp)) ; for(int i=0 ;i<N ;i++) { for(int j=0 ;j<N ;j++) { if(M[i][j]==‘#‘) { n++ ; mp[i][j]=n ; } } } memset(head,-1,sizeof(head)) ; cnt=0 ; for(int i=0 ;i<N ;i++) { for(int j=0 ;j<N ;j++) { if(M[i][j]==‘#‘) { for(int k=0 ;k<4 ;k++) { int xx=i+dx[k] ; int yy=j+dy[k] ; if(xx<0 || xx>=N || yy<0 || yy>=N)continue ; if(mp[xx][yy]) { add(mp[i][j],mp[xx][yy]) ; } } } } } m=n ; printf("Case %d: %d\n",cas,max_match()/2) ; } return 0 ;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。