poj 3041 二分图最小顶点覆盖 小行星删行或列
2012-03-03 22:42
435 查看
题意:给出图上小行星的位置,每次炸一个地方,就会删去该点所在的行或者列,求最少的炸弹数。
思路:就是二分图的最小顶点覆盖,小行星的位置进行建图,i--j 炸掉i 就相当于删去与i相连所以边 也就是炸掉了i行
//首先熟悉一下一个著名的名词“二分图的最小点覆盖数”:假如选了一个点就相当于覆盖了以它为端点的所有的边,要覆盖所有的边至少需要几个点?
思路:就是二分图的最小顶点覆盖,小行星的位置进行建图,i--j 炸掉i 就相当于删去与i相连所以边 也就是炸掉了i行
//首先熟悉一下一个著名的名词“二分图的最小点覆盖数”:假如选了一个点就相当于覆盖了以它为端点的所有的边,要覆盖所有的边至少需要几个点?
#include<iostream> using namespace std; bool g[505][505]; bool vis[505]; int link[505]; int N; bool dfs(int u) { for(int i=1;i<=N;i++) { if(!vis[i]&&g[u][i]) { vis[i]=1; if(link[i]==-1||dfs(link[i])) { link[i]=u; return true; } } } return false; } int maxmatch() { int num=0; memset(link,-1,sizeof(link)); for(int i=1;i<=N;i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) num++; } return num; } int main() { int M; int a,b; while(scanf("%d%d",&N,&M)!=EOF) { memset(g,0,sizeof(g)); while(M--) { scanf("%d%d",&a,&b); g[a][b]=1; } printf("%d\n",maxmatch()); } }
相关文章推荐
- poj 3041 Asteroids(二分图最小顶点覆盖)
- POJ 3041-Asteroids(二分图最小顶点覆盖)
- poj 3041 Asteroids( 最小顶点覆盖,二分图)
- poj-3041【二分图最小顶点覆盖】
- poj-3041-Asteroids【二分匹配&&最小顶点覆盖】
- POJ-3041 Asteroids(二分图最小定点覆盖)
- POJ 3041 Asteroids【二分图最大匹配.最小点覆盖】
- 【最小顶点覆盖数】POJ 3041 + POJ 2226+HDU 5093
- poj 3041-Asteroids-最小顶点覆盖
- POJ 3041 Asteroids (二分图最小点覆盖)
- POJ 3041 —— 最小顶点覆盖
- poj 3041 Asteroids 最小顶点覆盖 && 二分匹配
- 二分图最小点覆盖数——POJ 3041
- poj 3041 Asteroids 二分图最小点覆盖
- POJ1325 Machine Schedule 【二分图最小顶点覆盖】
- poj 3041 二分图最大匹配(最小点覆盖问题)
- Asteroids(POJ--3041 【二分图的最小顶点集 = 二分图的最大匹配】
- POJ 3041 Asteroids (最小顶点覆盖)
- POJ 3041--Asteroids【二分图 && 最小点数覆盖】
- POJ - 3041 Asteroids 二分图 最小点覆盖