poj 1486 二分图的必须边

来源:互联网 发布:林振强 知乎 编辑:程序博客网 时间:2024/05/16 05:59

题意:

       一些幻灯片,有一些数字在幻灯片里面,看能不能使得一个数字只能对应一张幻灯片.第一行代表有几张幻灯片.

给出这几张幻灯片的坐标,接着n行代表1-n个数字对应的坐标,然后要求你打印一个确定的使一个数字对应一张幻灯片.

如果不能对应输出none.

存在某些幻灯片只能由某个数字代表的话就按字典序打印出这些幻灯片和对应的数字.

#include<stdio.h>#include<string.h>#include<stack>#include<queue>#include<algorithm>using namespace std;#define ll long long#define me(a,b) memset(a,b,sizeof(a))/*struct node{    int u,next;}e[10000];*/struct node2{    int x1,x2,y1,y2;}g[30000];int book[30000],f[30000],map1[500][500];/*void add(int u,int v){    e[top].u=v;    e[top].next=head[u];    head[u]=top++;}*/int n;int dfs(int x){    for(int i=0;i<n;i++)    {        if(!book[i]&&map1[x][i])        {            book[i]=1;            if(f[i]==-1||dfs(f[i]))            {                f[i]=x;                return 1;            }        }    }    return 0;}int er(){     int ans=0;     me(f,-1);       for(int i=0;i<n;i++)       {           me(book,0);           ans+=dfs(i);       }       return ans;}int main(){    int tt=0;   while(~scanf("%d",&n)&&n)   {       tt++;       for(int i=0;i<n;i++)       {           scanf("%d%d%d%d",&g[i].x1,&g[i].x2,&g[i].y1,&g[i].y2);       }       memset(map1,0,sizeof(map1));       for(int i=0;i<n;i++)       {           int x,y;           scanf("%d%d",&x,&y);           for(int j=0;j<n;j++)           if(x>=g[j].x1&&x<=g[j].x2&&y>=g[j].y1&&y<=g[j].y2)           {               map1[j][i]=1;           }       }       printf("Heap %d\n",tt);      int flag=0;       for(int i=0;i<n;i++)       {           for(int j=0;j<n;j++)           {               if(!map1[i][j])                continue;                map1[i][j]=0;                if(er()<n)                {                    if(!flag)                    printf("(%c,%d)",i+'A',j+1);                    else printf(" (%c,%d)",i+'A',j+1);                    flag=1;                }                map1[i][j]=1;           }       }       if(flag)       {           printf("\n\n");       }       else printf("none\n\n");   }}

原创粉丝点击