您的位置:首页 > 运维架构 > Linux

高效学习LINUX内核

2012-03-23 19:26 260 查看
 

/* THE PROGRAM IS MADE BY PYY */
/*----------------------------------------------------------------------------//
Copyright (c) 2011 panyanyany All rights reserved.

URL   : http://poj.org/problem?id=3041 Name  : 3041 Asteroids

Date  : Saturday, November 19, 2011
Time Stage : one hour

Result:
9578655	panyanyany
3041
Accepted	224K	32MS	C++
1259B	2011-11-19 21:21:01
9578476	panyanyany
3041
Accepted	264K	16MS	C++
1304B	2011-11-19 20:46:42
9578453	panyanyany
3041
Wrong Answer			C++
1310B	2011-11-19 20:42:34

Test Data :

Review :
一开始觉得是最小顶点覆盖,结果错了,看人家的钥匙报告,才知道原来是
最大匹配……囧……
//----------------------------------------------------------------------------*/

#include <stdio.h>
#include <string.h>
#include <vector>

using std::vector ;

#define MAXSIZE		508

int		n, k ;
int		link[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] == false || find (link[j]))
{
link[j] = cur ;
return 1 ;
}
}
}
return 0 ;
}

int main ()
{
int i, j ;
int r, c ;
int sum ;

while (~scanf ("%d%d", &n, &k))
{
for (i = 1 ; i <= n ; ++i)
adj[i].clear () ;

for (i = 1 ; i <= k ; ++i)
{
scanf ("%d%d", &r, &c) ;
adj[r].push_back (c) ;
}

memset (link, 0, sizeof (link)) ;
sum = 0 ;
for (i = 1 ; i <= n ; ++i)
{
memset (cover, 0, sizeof (cover)) ;
sum += find (i) ;
}

// 感觉应该是最小顶点覆盖,怎么会是最大匹配呢?
printf ("%d\n", sum) ;
}
return 0 ;
}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: