您的位置:首页 > 其它

POJ 1486 Sorting Slides (二分图匹配)

2011-08-03 22:13 183 查看
刚学二分图,基本的匈牙利和KM运用还好,今晚被这题搞的头大!刚开始以为一个匈牙利就OK了,后来发现如果图和坐标点都重在一起的话匹配肯定可以完成。

所以就用了一次topsort。然后还是WA! 后来很蛋疼的发现里面的一句话 "Then print a series of all the slides whose numbers can be uniquely determined from the input. "

解释为,只要有一个输入是可以被推出的就要输出! 我勒个去啊!删了topsort改成去掉一条已经匹配边,重建图,重新匈牙利,返回值不同就输出,同样就跳过,最后判断无

输出就none! 终于AC了!

#include <iostream>
#include <stdio.h>
#include <string.h>
usingnamespace std;
struct node
{
int x1,x2,y1,y2;
char flag;

};
#define N 40
node nodes
;
int  number
;
int map

;
int t;
int dx
,dy
;
int vis
;
int DFS(int v)
{
for(int i=1;i<=t;i++)
if(!vis[i]&&map[v][i])
{
vis[i]=1;
if(dy[i]==-1||DFS(dy[i]))
{
dx[v]=i;
dy[i]=v;
return1;
}
}
return0;
}
int Hungary()
{
int i;
int ans=0;
memset(dx,-1,sizeof(dx));
memset(dy,-1,sizeof(dy));
for(i=1;i<=t;i++)
if(dx[i]==-1)
{
memset(vis,0,sizeof(vis));
ans+=DFS(i);
}
return ans;
}
int main()
{
int n,m,i,j;
int scase=0;
int flag=0;
while(scanf("%d",&t)!=EOF&&t)
{
printf("Heap %d\n",++scase);
char s='A';
flag=0;
for(i=1;i<=t;i++)
{
scanf("%d%d%d%d",&nodes[i].x1,&nodes[i].x2,&nodes[i].y1,&nodes[i].y2);
nodes[i].flag=s++;
}
memset(map,0,sizeof(map));
for(i=1;i<=t;i++)
{
scanf("%d%d",&n,&m);
number[i]=i;
for(j=1;j<=t;j++)
if(nodes[j].x1<n&&nodes[j].x2>n&&nodes[j].y1<m&&nodes[j].y2>m)
map[j][i]=1;
}
int dx1
;
memset(dx1,0,sizeof(dx1));
int sum=Hungary();
for(i=1;i<=t;i++)
dx1[i]=dx[i];
for(i=1;i<=t;i++)
{
map[i][dx1[i]]=0;
if(Hungary()!=sum)
{
if(flag==0)
printf("(%c,%d)",nodes[i].flag,number[dx1[i]]);
else
printf(" (%c,%d)",nodes[i].flag,number[dx1[i]]);
flag=1;
}
map[i][dx1[i]]=1;

}
if(!flag)
printf("none");
printf("\n\n");

}
return0;
}


感觉刚开始被我复杂化的图。其实关键一步想对了就好了!很多时候我们都是自己把问题想多了,代码就略长了!所以嘛!你懂得! 看不懂的地方可以留言!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: