POJ 1325(最小点覆盖)

这个题,就不用说什么了吧,最裸的最小点覆盖。

 

View Code
 1 #include <cstdlib>
 2 #include <cstdio>
 3 #include <cstring>
 4 #define M 1000000
 5 using namespace std;
 6 int head[M],next[M],to[M],linky[M],m,bk,n,cnt;
 7 bool vis[M];
 8 inline void add(int u,int v)
 9 {
10     to[cnt]=v; next[cnt]=head[u]; head[u]=cnt++;
11 }
12 void read()
13 {
14     scanf("%d%d",&m,&bk);
15     memset(head,-1,sizeof head);
16     cnt=0;
17     for(int i=1,a,b,c;i<=bk;i++)
18     {
19         scanf("%d%d%d",&a,&b,&c);
20         if(b&&c) add(b,c);
21     }
22 }
23 bool dfs(int u)
24 {
25     for(int i=head[u];~i;i=next[i])
26         if(!vis[to[i]])
27         {
28             vis[to[i]]=true;
29             if(linky[to[i]]==-1||dfs(linky[to[i]]))
30             {
31                 linky[to[i]]=u;
32                 return true;
33             }
34         }
35     return false;
36 }
37 void go()
38 {
39     int ans=0;
40     memset(linky,-1,sizeof linky);
41     for(int i=1;i<=n;i++)
42     {
43         memset(vis,0,sizeof vis);
44         if(dfs(i)) ans++;
45     }
46     printf("%d\n",ans);
47 }
48 int main()
49 {
50     while(scanf("%d",&n),n)
51     {
52         read();
53         go();
54     }
55     return 0;
56 }
posted @ 2012-08-28 23:04  proverbs  阅读(146)  评论(0编辑  收藏  举报