二分 Asteroids

来源:互联网 发布:网络报警主机 编辑:程序博客网 时间:2024/06/06 03:03

                           Asteroids               

INPUT DETAILS: 

The following diagram represents the data, where "X" is an asteroid and "." is empty space: 
X.X 
.X. 
.X.
 

OUTPUT DETAILS: 

Bessie may fire across row 1 to destroy the asteroids at (1,1) and (1,3), and then she may fire down column 2 to destroy the asteroids at (2,2) and (3,2).


     对于这道题还能用二分感到震惊,但是弄清最小顶点覆盖是什么觉得就该这样做,Orz;

     |最大匹配数|=|最小顶点覆盖|

     |最大匹配数|+||最小边覆盖|=|V|

     |最大独立集|+|最小顶点覆盖|=|V|


#include<iostream>#include<algorithm>#include<string>#include<queue>#include<cmath>#include<vector>#include<stdlib.h>#include<iomanip>#include<list>#include<stack>#include<memory.h>#include<ctype.h>using namespace std;typedef long long ll;const int MAXN = 510;int uN, vN;int g[MAXN][MAXN];int linker[MAXN];bool used[MAXN];bool dfs(int u){int v;for (v = 0; v<uN; v++)if (g[u][v] && !used[v]){used[v] = true;if (linker[v] == -1 || dfs(linker[v])){linker[v] = u;return true;}}return false;}int hungary(){int res = 0;int u;memset(linker, -1, sizeof(linker));for (u = 0; u<uN; u++){memset(used, 0, sizeof(used));if (dfs(u)) res++;}return res;}int main(){int u, v;while (scanf("%d%d", &uN, &vN) != EOF){memset(g, 0, sizeof(g));while (vN--){scanf("%d%d", &u, &v);u--;v--;g[u][v] = 1;}printf("%d\n", hungary());}return 0;}


原创粉丝点击