题目:http://poj.org/problem?id=1719

要求每一行必须都被射到,每一列恰好一个格子被射到。

通过行r去求匹配数num

当r<=c时,num是可以等于r的

这时候每一行都被射到过,可能存在列没有被射到,可以再该列中任意选一个格子,因为对于每一行中被射中的格子数没有限定

当r>c时,num不可能等于r

也就是说不是所有行都可以被射到,所以不符合要求,直接输出no

代码:

View Code
 1 #include<stdio.h>
2 #include<string.h>
3 #define maxn 1001
4 int r,c,n;
5 int mark[maxn];
6 bool map[maxn][maxn],visit[maxn];
7
8 bool dfs(int k)
9 {
10 int i;
11 for(i=1;i<=c;i++)
12 {
13 if(map[k][i]&&!visit[i])
14 {
15 visit[i]=1;
16 if(mark[i]==-1||dfs(mark[i]))
17 {
18 mark[i]=k;
19 return 1;
20 }
21 }
22 }
23 return 0;
24 }
25
26
27 void output(int num)
28 {
29 int i,j;
30 if(num==r)
31 {
32 for(i=1;i<=c;i++)
33 {
34 if(mark[i]!=-1)
35 {
36 printf("%d ",mark[i]);
37 }
38 else
39 {
40 for(j=1;j<=r;j++)
41 {
42 if(map[j][i]==1)
43 {
44 printf("%d ",j);
45 break;
46 }
47 }
48 }
49 }
50 }
51 else
52 {
53 printf("NO");
54 }
55 printf("\n");
56 }
57
58 void solve()
59 {
60 int i,num=0;
61 memset(mark,-1,sizeof(mark));
62 for(i=1;i<=r;i++)
63 {
64 memset(visit,0,sizeof(visit));
65 if(dfs(i))
66 num++;
67 }
68 output(num);
69 }
70
71 int main()
72 {
73 int i,x,y;
74 while(scanf("%d",&n)!=EOF)
75 {
76 while(n--)
77 {
78 scanf("%d%d",&r,&c);
79 memset(map,0,sizeof(map));
80 for(i=1;i<=c;i++)
81 {
82 scanf("%d%d",&x,&y);
83 map[x][i]=1;
84 map[y][i]=1;
85 }
86 if(r>c)
87 {
88 printf("NO\n");
89 continue;
90 }
91 solve();
92 }
93 }
94 return 0;
95 }

  

 posted on 2011-07-26 19:04  渲染独白  阅读(211)  评论(0编辑  收藏  举报