zoukankan      html  css  js  c++  java
  • 最大匹配必须边

    poj1486

    题意:

    给出一些矩形的坐标和一些点的坐标,若点在矩形内,则该点和该矩形匹配。

    问哪些匹配边是可以唯一确定的,可以先求出最大匹配,然后每次删除一条匹配边,

    然后再求最大匹配,如果匹配个数不变,那么该边不是必须边,否则就是必须边

     1 #include <stdio.h>
     2 #include <string.h>
     3 const int N = 1000;
     4 struct node
     5 {
     6     int xMin,xMax,yMin,yMax;
     7 }slide[N];
     8 int Map[N][N];
     9 bool vis[N];
    10 int cy[N];
    11 int cx[N];
    12 int n;
    13 int path[N];
    14 bool dfs(int u)
    15 {
    16     for(int i=0; i<n; ++i)
    17     {
    18         if(!vis[i] && Map[u][i])
    19         {
    20             vis[i] = true;
    21             if(cy[i]==-1 || dfs(cy[i]))
    22             {
    23                 cy[i] = u;
    24                 cx[u] = i;
    25                 return true;
    26             }
    27         }
    28     }
    29     return false;
    30 }
    31 int MaxMatch()
    32 {
    33     int cnt = 0;
    34     memset(cy, -1, sizeof(cy));
    35     memset(cx, -1, sizeof(cx));
    36     for(int i=0; i<n; ++i)
    37     {
    38         if(cx[i]==-1)
    39         {
    40             memset(vis, 0, sizeof(vis));
    41             cnt += dfs(i);
    42         }
    43     }
    44     return cnt;
    45 }
    46 int main()
    47 {
    48     
    49     int i,j,x,y;
    50     int tCase = 1;
    51     while(true)
    52     {
    53         scanf("%d",&n);
    54         if(n == 0)
    55             break;
    56         for(i=0; i<n; ++i)        
    57             scanf("%d%d%d%d",&slide[i].xMin,&slide[i].xMax,
    58                             &slide[i].yMin,&slide[i].yMax);
    59         memset(Map, 0, sizeof(Map));
    60         for(i=0; i<n; ++i)
    61         {
    62             scanf("%d%d",&x,&y);
    63             for(j=0; j<n; ++j)
    64             {
    65                 if(x>=slide[j].xMin && x<=slide[j].xMax 
    66                     &&y>=slide[j].yMin && y<=slide[j].yMax)
    67                     Map[j][i] = 1;
    68             }
    69         }
    70         printf("Heap %d
    ",tCase++);
    71         int ans = MaxMatch();//求出最大匹配
    72         bool flag = false;
    73         for(i=0; i<n; ++i)//记录X集合中的i与Y集合中的那些点匹配
    74             path[i] = cx[i];
    75     
    76         for(i=0; i<n; ++i)
    77         {
    78             Map[i][path[i]] = 0;//删除匹配边
    79             if(ans == MaxMatch())
    80                 continue;
    81             //如果,匹配的个数减少,那么该匹配边是必须边
    82             if(flag)
    83                 printf(" ");
    84             flag = true;
    85             printf("(%c,%d)",'A'+i,path[i]+1);
    86             Map[i][path[i]] =1;
    87         }
    88         
    89         if(!flag)
    90             printf("none");
    91         puts("");
    92         puts("");
    93     
    94     }
    95     return 0;
    96 }
  • 相关阅读:
    mysql的一些不常用语句
    redis的使用1
    linux理论知识点(用于考试)
    服务器负载均衡数据同步的实现
    解决com.ibatis.sqlmap.client.SqlMapException: There is no statement named in this SqlMap
    cvc-complex-type.2.3: Element 'beans' cannot have character [children]
    Oracle11g服务详细介绍及哪些服务是必须开启的
    Oracle
    oracle 帐号scott被锁定 如何解锁
    记录
  • 原文地址:https://www.cnblogs.com/justPassBy/p/4023010.html
Copyright © 2011-2022 走看看