zoukankan      html  css  js  c++  java
  • hdu 1281 棋盘游戏 (二分图)

    http://acm.hdu.edu.cn/showproblem.php?pid=1281

    将所有的行 看成几何 x  所有的列看成几何 y  

    若 (i,j)可以放 一个车的话,那么,我们就将 i -》j  连线,

    因为 每一行只能放一个 车 ,每一列也只能放一个车,所以,最大匹配,及为所能放的最多上网车;

    然后 我们枚举每一个可以放 车的 点,就可以知道是否这个点是 否是必须的。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<iostream>
     5 #include<algorithm>
     6 #include<set>
     7 #include<map>
     8 #include<queue>
     9 #include<vector>
    10 #include<string>
    11 #define Min(a,b) a<b?a:b
    12 #define Max(a,b) a>b?a:b
    13 #define CL(a,num) memset(a,num,sizeof(a));
    14 #define eps  1e-6
    15 #define inf 10001000
    16 
    17 #define ll   __int64
    18 
    19 #define  read()  freopen("data.txt","r",stdin) ;
    20 const double pi  = acos(-1.0);
    21 const int maxn = 124;
    22 
    23 using namespace std;
    24 int n,m,k;
    25 int mat[maxn][maxn],result[maxn],vis[maxn] ;
    26 int x[maxn*maxn],y[maxn*maxn] ;
    27 int find(int a)
    28 {
    29     int i ;
    30     for(i = 1 ; i <= m;i++)
    31     {
    32         if(mat[a][i]&&!vis[i])
    33         {
    34             vis[i] = 1;
    35             if(result[i] == 0||find(result[i]))
    36             {
    37                 result[i] = a ;
    38                 return 1 ;
    39 
    40             }
    41         }
    42     }
    43     return 0 ;
    44 }
    45 int getans()
    46 {
    47      CL(result,0) ;
    48     int cnt = 0 ;
    49     for(int i = 1;i <= n;i++)
    50     {
    51         CL(vis,0);
    52         if(find(i))cnt++;
    53     }
    54     return cnt ;
    55 }
    56 int main()
    57 {
    58     int cas = 0,i ;
    59     while(scanf("%d%d%d",&n,&m,&k)!=EOF)
    60     {
    61         CL(vis,0);
    62         CL(result,0) ;
    63         CL(mat,0) ;
    64         for(i =0 ; i< k;i++)
    65         {
    66             scanf("%d%d",&x[i],&y[i]) ;
    67             mat[x[i]][y[i]] = 1;
    68 
    69         }
    70 
    71         int ans= getans() ;
    72         int  num = 0 ;
    73         for(i = 0; i< k;i++)
    74         {
    75 
    76            mat[x[i]][y[i]] = 0;
    77 
    78            int t = getans();
    79            if(t < ans)num ++;
    80            mat[x[i]][y[i]] = 1;
    81 
    82         }
    83 
    84 
    85         printf("Board %d have %d important blanks for %d chessmen.\n",++cas,num,ans);
    86     }
    87 }
  • 相关阅读:
    注册表
    windows.location.href在IE6下停止工作
    LINUX配置IP的三种方式
    InnoSetup 打包代码 检测.netFramework
    SQLiteHelper
    黑马程序员_看视频记笔记_C#编程基础02
    通过注册表来检测是否安装Office
    SQLiteHelper
    TSQL
    IIS下发布关于Excel导入导出时遇到的问题集锦
  • 原文地址:https://www.cnblogs.com/acSzz/p/2714147.html
Copyright © 2011-2022 走看看