【二分图+最小覆盖+简单题】杭电 hdu 1054 Strategic Game

来源:互联网 发布:源氏木语 知乎 编辑:程序博客网 时间:2024/05/16 00:53


/* THE PROGRAM IS MADE BY PYY *//*----------------------------------------------------------------------------//    Copyright (c) 2011 panyanyany All rights reserved.    URL   : http://acm.hdu.edu.cn/showproblem.php?pid=1054    Name  : 1054 Strategic Game    Date  : Monday, November 7, 2011    Time Stage : half an hour    Result: 49228572011-11-07 20:16:34Accepted1054703MS336K1378 BC++pyyTest Data :Review :写完了代码,案例不通过,观摹了majia大神的代码,发现原来要构造双向图……//----------------------------------------------------------------------------*/#include <stdio.h>#include <vector>using std::vector ;#define MAXSIZE 1509intn ;intlink[MAXSIZE], cover[MAXSIZE] ;vector<int> adj[MAXSIZE] ;int find (int cur){int i, j ;for (i = 0 ; i < adj[cur].size () ; ++i){j = adj[cur][i] ;if (cover[j] == false){cover[j] = true ;if (link[j] == -1 || find (link[j])){link[j] = cur ;return 1 ;}}}return 0 ;}int main (){int i, j ;int x, id, cnt ;int sum ;while (~scanf ("%d", &n)){for (i = 0 ; i < n ; ++i){scanf ("%d:(%d)", &id, &cnt) ;if (cnt)for (j = 0 ; j < cnt ; ++j){scanf ("%d", &x) ;adj[id].push_back (x) ;adj[x].push_back (id) ; // 构造双向图}}sum = 0 ;memset (link, -1, sizeof (link)) ;for (i = 0 ; i < n ; ++i){memset (cover, 0, sizeof (cover)) ;sum += find (i) ;}printf ("%d\n", sum / 2) ;for (i = 0 ; i < n ; ++i)adj[i].clear () ;}return 0 ;}


原创粉丝点击