poj 1486

来源:互联网 发布:电视网络机顶盒 编辑:程序博客网 时间:2024/06/06 15:38

     题目意思就是要绝对匹配。先找点和矩形的匹配,点在矩形中就算二者匹配。然后找出最大匹配。枚举每条匹配边,删除后再次进行匹配,但不能匹配时(即新的最大匹配比原匹配小),该边即为所求的绝对匹配边,将其输出。若不存在这样的边,输出“none”。

     以下是详细代码:

 

  1.  #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    const int M=30;
  2. struct point
    {
     int xmin,xmax,ymin,ymax;
    }p[M];
    bool map[M][M];
    bool vis[M];
    int result[M],ans;
    int n;
  3. void init()
    {
     memset(result,0,sizeof(result));
     memset(map,0,sizeof(map));
     memset(map1,0,sizeof(map1));
     ans=0;
    }
  4. bool find(int a)
    {
     int i,j;
     for(i=1;i<=n;i++)
     {
      if(map[a][i] && !vis[i])
      {
       vis[i]=1;
       if(result[i]==0 || find(result[i]))
       {
        result[i]=a;
        return true;
       }
      }
     }
     return false;
    }
  5. void work()
    {
     for(int i=1;i<=n;i++)
     {
      memset(vis,0,sizeof(vis));
      if(find(i)) ans++;
     }
    }
  6. int main()
    {
     int t=1;
     while(scanf("%d",&n),n)
     {
      int i,j;
      init();
      for(i=1;i<=n;i++)
      {
       scanf("%d%d%d%d",&p[i].xmin,&p[i].xmax,&p[i].ymin,&p[i].ymax);
      }
      for(i=1;i<=n;i++)
      {
       int x,y;
       scanf("%d%d",&x,&y);
       for(j=1;j<=n;j++)
       {
        if(x>=p[j].xmin && x<=p[j].xmax && y>=p[j].ymin && y<=p[j].ymax)
         map[i][j]=1;
       }
      }
      work();
      int cnt=0;
      printf("Heap %d/n",t++);
      if(ans<n)
      {
       printf("none/n");
       printf("/n");
       continue;
      }
      for(i=1;i<=n;i++)
      {
       int tmp=result[i];
       result[i]=0;
       map[tmp][i]=0;
       memset(vis,0,sizeof(vis));
       if(!find(tmp))
       {
        cnt++;
        result[i]=tmp;
        printf("(%c,%d) ",'A'+i-1,tmp);
       }
       map[tmp][i]=1;
      }
      if(cnt==0)
       printf("none/n");
      else
       printf("/n");
      printf("/n");
     }
     return 0;
    }