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 }

你可能感兴趣的:(poj)