POJ 1486 Sorting Slides (二分图匹配)

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

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

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

输出就none! 终于AC了!

  1 #include <iostream>   
2 #include <stdio.h>
3 #include <string.h>
4 usingnamespace std;
5 struct node
6 {
7 int x1,x2,y1,y2;
8 char flag;
9
10 };
11 #define N 40
12 node nodes[N];
13 int number[N];
14 int map[N][N];
15 int t;
16 int dx[N],dy[N];
17 int vis[N];
18 int DFS(int v)
19 {
20 for(int i=1;i<=t;i++)
21 if(!vis[i]&&map[v][i])
22 {
23 vis[i]=1;
24 if(dy[i]==-1||DFS(dy[i]))
25 {
26 dx[v]=i;
27 dy[i]=v;
28 return1;
29 }
30 }
31 return0;
32 }
33 int Hungary()
34 {
35 int i;
36 int ans=0;
37 memset(dx,-1,sizeof(dx));
38 memset(dy,-1,sizeof(dy));
39 for(i=1;i<=t;i++)
40 if(dx[i]==-1)
41 {
42 memset(vis,0,sizeof(vis));
43 ans+=DFS(i);
44 }
45 return ans;
46 }
47 int main()
48 {
49 int n,m,i,j;
50 int scase=0;
51 int flag=0;
52 while(scanf("%d",&t)!=EOF&&t)
53 {
54 printf("Heap %d\n",++scase);
55 char s='A';
56 flag=0;
57 for(i=1;i<=t;i++)
58 {
59 scanf("%d%d%d%d",&nodes[i].x1,&nodes[i].x2,&nodes[i].y1,&nodes[i].y2);
60 nodes[i].flag=s++;
61 }
62 memset(map,0,sizeof(map));
63 for(i=1;i<=t;i++)
64 {
65 scanf("%d%d",&n,&m);
66 number[i]=i;
67 for(j=1;j<=t;j++)
68 if(nodes[j].x1<n&&nodes[j].x2>n&&nodes[j].y1<m&&nodes[j].y2>m)
69 map[j][i]=1;
70 }
71 int dx1[N];
72 memset(dx1,0,sizeof(dx1));
73 int sum=Hungary();
74 for(i=1;i<=t;i++)
75 dx1[i]=dx[i];
76 for(i=1;i<=t;i++)
77 {
78 map[i][dx1[i]]=0;
79 if(Hungary()!=sum)
80 {
81 if(flag==0)
82 printf("(%c,%d)",nodes[i].flag,number[dx1[i]]);
83 else
84 printf(" (%c,%d)",nodes[i].flag,number[dx1[i]]);
85 flag=1;
86 }
87 map[i][dx1[i]]=1;
88
89 }
90 if(!flag)
91 printf("none");
92 printf("\n\n");
93
94 }
95 return0;
96 }

感觉刚开始被我复杂化的图。其实关键一步想对了就好了!很多时候我们都是自己把问题想多了,代码就略长了!所以嘛!你懂得!  看不懂的地方可以留言! 
 

posted @ 2011-08-03 22:13  Lxsec  阅读(254)  评论(0编辑  收藏  举报