poj2226

来源:互联网 发布:c语言 设备端接入 编辑:程序博客网 时间:2024/06/16 13:51

不要直接用行当X,列当Y。这样会出错误的。

应该是统计横着的板子数作为X,竖着的板子数作为Y


原图         按行来数             按列来数

*.*.            1  0  2  0             1  0  4  0

.***           0  3  3  3             0  3  4  5

***.           4  4  4  0             2  3  4  0

..*.            0   0  5  0            0  0  4  0


之后对应连线。

比如坐标(0,0)处,行为1,列为1. 那么连接1,1;

        坐标(2,0)-(2,2)处,行为4,4,4,列为2,3,4.那么连接4,2      4,3   4, 4即可


之后就是最小点覆盖问题

  1. #include <iostream>  
  2. using namespace std;  
  3. #define MAXV 1000  
  4. #define MAXS 60  
  5.   
  6. char s[MAXS][MAXS];  
  7. bool map[MAXV][MAXV];  
  8. int tmp[MAXS][MAXS],n,m,cvsum,rvsum;  
  9. int link[MAXV],use[MAXV];  
  10.   
  11. void build_gragh(){  
  12.     int i,j,flag=0;  
  13.     cvsum=rvsum=0;  
  14.     memset(map,0,sizeof(map));  
  15.     memset(tmp,0,sizeof(tmp));  
  16.       
  17.     for(i=1;i<=n;i++){  
  18.         flag=0;  
  19.         for(j=1;j<=m;j++){  
  20.             if(flag==0 && s[i][j]=='*'){ flag=1; cvsum++; }  
  21.             if(flag==1 && s[i][j]=='*') tmp[i][j]=cvsum;  
  22.             if(s[i][j]=='.') flag=0;  
  23.         }  
  24.     }  
  25.       
  26.     for(i=1;i<=m;i++){  
  27.         flag=0;  
  28.         for(j=1;j<=n;j++){  
  29.             if(flag==0 && s[j][i]=='*'){ flag=1; rvsum++; }  
  30.             if(flag==1 && s[j][i]=='*') map[tmp[j][i]][rvsum]=1;  
  31.             if(s[j][i]=='.') flag=0;  
  32.         }  
  33.     }  
  34. }  
  35.   
  36. int dfs(int x){  
  37.     int i,j;  
  38.     for(i=1;i<=rvsum;i++)  
  39.         if(!use[i] && map[x][i]){  
  40.             use[i]=1;j=link[i];link[i]=x;  
  41.             if(j==-1 || dfs(j)) return true;  
  42.             link[i]=j;  
  43.         }  
  44.         return false;  
  45. }  
  46.   
  47. int hungary(){  
  48.     int num=0,i,j;  
  49.     memset(link,-1,sizeof(link));  
  50.     for(i=1;i<=cvsum;i++){  
  51.         for(j=1;j<=rvsum;j++) use[j]=0;  
  52.         if(dfs(i)) num++;  
  53.     }  
  54.     return num;  
  55. }  
  56.   
  57. int main(){  
  58.     int i;  
  59.     while(~scanf("%d%d\n",&n,&m)){  
  60.         for(i=1;i<=n;i++) gets(s[i]+1);  
  61.         build_gragh();  
  62.         printf("%d\n",hungary());  
  63.     }  
  64.     return 0;  
  65. }  

原创粉丝点击