zoukankan      html  css  js  c++  java
  • 二分图的必须边——pku1486

    题意是判断二分图的边是否唯一
    先最大二分匹配下
    枚举 A集合的点所连接的边 删除
    在最大二分匹配下看匹配数是否与没删前一样,若不一样,则说明该边是唯一边
    View Code
    #include<stdio.h>
    #include
    <string.h>

    bool map[59][59];
    int mark[59];
    int rmark[59];
    bool flag[59];
    int m,g;

    struct data
    {
    int minx,miny,maxx,maxy;
    }node[
    59];

    struct data1
    {
    int x,y;
    }point[
    59];

    struct data2
    {
    char str;
    int no;
    }temp[
    59];

    bool dfs(int x)
    {
    int i;
    for(i=1;i<=m;i++)
    {
    if(map[x][i]==0||flag[i]) continue;

    flag[i]
    =1;
    if(mark[i]==0||dfs(mark[i]))
    {
    mark[i]
    =x;
    return 1;
    }
    }
    return 0;
    }

    int main()
    {
    int i,k,j;
    int count;
    int add=0;
    while(scanf("%d",&k),k)
    {
    add
    ++;
    g
    =m=k;
    memset(map,
    0,sizeof(map));
    memset(mark,
    0,sizeof(mark));
    count
    =0;

    for(i=1;i<=k;i++)
    {
    scanf(
    "%d%d%d%d",&node[i].minx,&node[i].maxx,&node[i].miny,&node[i].maxy);
    }
    for(i=1;i<=k;i++)
    {
    scanf(
    "%d%d",&point[i].x,&point[i].y);
    }

    for(i=1;i<=k;i++)
    {
    for(j=1;j<=k;j++)
    {
    if(point[j].x>=node[i].minx&&point[j].x<=node[i].maxx)
    if(point[j].y>=node[i].miny&&point[j].y<=node[i].maxy)
    {
    map[i][j]
    =1;
    }

    }
    }

    for(i=1;i<=g;i++)
    {
    memset(flag,
    0,sizeof(flag));
    if(dfs(i)==1) count++;
    }
    for(i=1;i<=k;i++)//记录mark
    {
    rmark[i]
    =mark[i];
    }

    int rj;
    bool addT=0;
    printf(
    "Heap %d\n",add);
    for(i=1;i<=k;i++)//删除连接的边,看是否最大匹配数是否还为n
    {
    count
    =0;
    for(j=1;j<=m;j++)
    {
    if(rmark[j]==i)
    {
    rj
    =j;
    map[i][j]
    =0;
    break;
    }
    }


    memset(mark,
    0,sizeof(mark));
    for(j=1;j<=g;j++)
    {

    memset(flag,
    false,sizeof(flag));
    if(dfs(j)==1) count++;
    }
    if(count<k)
    {

    for(j=1;j<=k;j++)
    {
    if(rmark[j]==i)
    break;
    }
    if(addT==0)
    printf(
    "(%c,%d)",'A'-1+i,j);
    else
    printf(
    " (%c,%d)",'A'-1+i,j);
    addT
    =1;
    }

    map[i][rj]
    =1;
    }
    if(addT==0)
    {
    printf(
    "none");
    }
    printf(
    "\n\n");
    }
    }

      

  • 相关阅读:
    Apache Thrift的简单使用
    ExternalInterface的简单使用方法
    Android各种屏幕分辨率(VGA、HVGA、QVGA、WQVGA、WVGA、FWVGA) 具体解释
    白话经典算法系列之六 高速排序 高速搞定
    HTML学习_01
    Codeforces Round #256 (Div. 2) A. Rewards
    activity
    自己生产签名和数字证书的方法
    Android项目目录结构
    Android程序的安装和打包
  • 原文地址:https://www.cnblogs.com/huhuuu/p/2112023.html
Copyright © 2011-2022 走看看