nyoj 239 月老的难题

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=239

简单的二分匹配,不过这道题很怪,矩阵就是tle,临界表200多,很无语。

以前做个,没过现在看看以前还是没学好,有几处明显错误!

AC

View Code
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 int n[505],m[505];
 6 int vist[505];
 7 int head[505];
 8 struct ss {
 9     int x,next;
10 }edge[10005];
11 int N;
12 int sum,g;
13 int dfs(int v)
14 {
15     int i,tt;
16     
17     for (i=head[v];i!=-1;i=edge[i].next)
18     {
19         tt=edge[i].x;
20         if(!vist[tt])
21         {
22             vist[tt]=1;
23             if(m[tt]==-1||dfs(m[tt]))
24             {
25                 n[v]=tt;
26                 m[tt]=v;
27                 return 1;
28             }
29         }
30     }
31         return 0;    
32 }
33 void maxmatch()
34 {
35     int i;
36     sum=0;
37     for (i=1;i<=g;i++)
38     {
39         memset(vist,0,sizeof(vist));
40         if(n[i]==-1&&dfs(i))
41             sum++;
42     }
43 }
44 int main()
45 {
46     int i,x,y,k,w;
47     scanf("%d",&k);
48     while (k--)
49     {
50         scanf("%d%d",&g,&w);
51         N=0;
52         memset(n,-1,sizeof(n));
53         memset(m,-1,sizeof(m));
54         memset(head,-1,sizeof(head));
55             for (i=1;i<=w;i++)
56             {
57                 scanf("%d%d",&x,&y);
58                 edge[N].x=y;
59                 edge[N].next=head[x];
60                 head[x]=N++;
61             }
62             maxmatch();
63             printf("%d\n",sum);
64     }
65     return 0;
66 }

tle

View Code
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 int map[505][505],n[505],m[505];
 6 int vist[505];
 7 int sum,g;
 8 int dfs(int v)
 9 {
10     int i;
11     
12     for (i=1;i<=g;i++)
13         if(!vist[i]&&map[v][i])
14         {
15             vist[i]=1;
16             if(m[i]==-1||dfs(m[i]))
17             {
18                 n[v]=i;
19                 m[i]=v;
20                 return 1;
21             }
22         }
23         return 0;    
24 }
25 void maxmatch()
26 {
27     int i;
28     sum=0;
29     for (i=1;i<=g;i++)
30     {
31         memset(vist,0,sizeof(vist));
32         if(n[i]==-1&&dfs(i))
33             sum++;
34     }
35 }
36 int main()
37 {
38     int i,x,y,k,w;
39     scanf("%d",&k);
40     while (k--)
41     {
42         scanf("%d%d",&g,&w);
43         memset(map,0,sizeof(map));
44         memset(n,-1,sizeof(n));
45         memset(m,-1,sizeof(m));
46         
47         for (i=1;i<=w;i++)
48         {
49             scanf("%d%d",&x,&y);
50             map[x][y]=1;
51         }
52         maxmatch();
53         printf("%d\n",sum);
54     }
55     return 0;
56 } 

 

posted @ 2012-04-28 09:30  我们一直在努力  阅读(169)  评论(0编辑  收藏  举报