hdu 4185 Oil Skimming (最大匹配)

来源:互联网 发布:电子鼓教学软件 编辑:程序博客网 时间:2024/04/30 06:19

最大二分匹配


#include<stdio.h>#include<string.h>char map[610][610];int n,in[610][610];int mp[1000][1000];int temp,link[1000],use[1000];int find(int i){int j;for(j=1;j<temp;j++){if(use[j]==0&&mp[i][j]==1){use[j]=1;if(link[j]==-1||find(link[j])==1){link[j]=i;return 1;}}}return 0;}int main(){int i,j,t,sum,o=1;scanf("%d",&t);while(t--){scanf("%d",&n);getchar();temp=1;for(i=0;i<n;i++){for(j=0;j<n;j++){scanf("%c",&map[i][j]);if(map[i][j]=='#')in[i][j]=temp++;}getchar();}memset(mp,0,sizeof(mp));for(i=0;i<n;i++)for(j=0;j<n;j++){if(map[i][j]=='.')continue;if(j-1>=0&&map[i][j-1]=='#')mp[in[i][j]][in[i][j-1]]=1;if(j+1<n&&map[i][j+1]=='#')mp[in[i][j]][in[i][j+1]]=1;if(i-1>=0&&map[i-1][j]=='#')mp[in[i][j]][in[i-1][j]]=1;if(i+1<n&&map[i+1][j]=='#')mp[in[i][j]][in[i+1][j]]=1;}/*for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%d ",in[i][j]);printf("\n");}printf("\n");for(i=1;i<temp;i++){for(j=1;j<=temp;j++)printf("%d ",mp[i][j]);printf("\n");}printf("\n");*/sum=0;memset(link,-1,sizeof(link));for(i=1;i<temp;i++){memset(use,0,sizeof(use));sum+=find(i);}/*for(i=1;i<temp;i++)printf("%d ",link[i]);printf("\n");*/printf("Case %d: %d\n",o++,sum/2);//图是双向的,所以要除2}return 0;}


原创粉丝点击