zoukankan      html  css  js  c++  java
  • HDU1507 二分图 棋盘覆盖问题

     1 /*HDU1507
     2 
     3 */
     4 #include <iostream>
     5 #include <cmath>
     6 #include <algorithm>
     7 #include <string.h>
     8 #include <stdio.h>
     9 #include <set>
    10 #include <stack>
    11 #include <queue>
    12 #include <vector>
    13 #define maxn 11100
    14 using namespace std;
    15 
    16 /*(x,y)--> num = (x-1) * (M) + y;
    17    num -- >  (x,y) == (num/M+1 ,num % M)
    18 */
    19 vector<int>G[maxn];
    20 bool visit[maxn];
    21 int match[maxn];
    22 int a[][2]={{0,-1},{0,1},{1,0},{-1,0}};
    23 int N,M,K;
    24 bool dfs(int s)//找到从s点出发的可增广路
    25 {
    26     for(int i=0;i<G[s].size();i++){
    27         int v=G[s][i];
    28         if (!visit[v]){
    29             visit[v]=true;
    30             if (match[v]==0 || dfs(match[v])){//说明v对应的项有增广路
    31                 match[v]=s;//修改v的对应项(即互斥点)是s
    32                 return true;
    33             }
    34         }
    35     }
    36     return false;
    37 }
    38 
    39 int hungary(){
    40     int ans=0;
    41     memset(match,0,sizeof(match));//清空匹配
    42     for(int i=1;i<=N*M;i++){
    43         memset(visit,0,sizeof(visit));//注意清空增广路
    44         if (dfs(i)) ans++;
    45     }
    46     return ans;
    47 }
    48 bool map[110][110];
    49 void read(){
    50     cin>>K;
    51     memset(map,0,sizeof (map));
    52     for(int i=1; i <=K ;i++){
    53         int x,y;
    54         scanf("%d%d",&x,&y);
    55         map[x][y]=true;
    56     }
    57 }
    58 void builtG(){
    59     for(int i=1;i<=M*N;i++){
    60         G[i].clear();
    61     }
    62     for(int i=1;i<=N;i++){
    63         for(int j=1;j<=M;j++){
    64             if (map[i][j] || (i+j)%2==0) continue;
    65             for(int l=0;l<4;l++){
    66                 int x=i+a[l][0],y=j+a[l][1];
    67                 if ( x<1 || x>N || y<1 || y>M || map[x][y]) continue;
    68 //                G[(x-1) * (M) + y].push_back((i-1) * (M) + j);
    69                 G[(i-1) * (M) + j].push_back((x-1) * (M) + y);
    70             }
    71         }
    72     }
    73     return ;
    74 }
    75 void getxy(int num,int &x,int &y){
    76     x = num/M + 1;
    77     if (num % M == 0) x--;
    78     y = num-(x-1)*M;
    79 }
    80 bool flag[maxn];
    81 int main(){
    82     while(~scanf("%d%d",&N,&M) && N && M){
    83         read();
    84         builtG();
    85         printf("%d
    ",hungary());
    86         memset(flag,0,sizeof(flag));
    87         for (int i=1;i<=N*M;i++){
    88             if (match[i]==0) continue;
    89             int x1,y1,x2,y2;
    90             getxy(i,x1,y1);
    91 //            cout<<"i="<<i<<","<<x<<","<<y<<endl;
    92             getxy(match[i],x2,y2);
    93             printf("(%d,%d)--(%d,%d)
    ",x1 ,y1,x2,y2);
    94             flag[i]=flag[match[i]]=true;
    95         }
    96         printf("
    ");
    97     }
    98     return 0;
    99 }
  • 相关阅读:
    nyist_21(三个水杯)(BFS)
    寒假刷题之普通之红与黑
    寒假刷题之普通之变形课
    寒假刷题之普通之最小差
    什么是 Spring Boot
    择业十诫----与内心的渴望同行
    模式窗体中调用父页面Javascript
    二级域名解析
    软件测试
    网狐系统介绍
  • 原文地址:https://www.cnblogs.com/little-w/p/3650355.html
Copyright © 2011-2022 走看看