POJ 3041Asteroids(二分图最大匹配)
2014-06-02 19:12
369 查看
题目地址:http://poj.org/problem?id=3041
刚学二分匹配真心伤不起啊。。刚上来一看这题。。TMD跟二分匹配有毛线关系啊。。。后来想了好长时间,通过输入得到了点灵感。。。那就是用横坐标与纵坐标匹配,x与y坐标的连线就是该点,然后就是求最少点覆盖问题,从而根据最少点覆盖=最大匹配,转化成了二分图最大匹配问题。代码如下:
刚学二分匹配真心伤不起啊。。刚上来一看这题。。TMD跟二分匹配有毛线关系啊。。。后来想了好长时间,通过输入得到了点灵感。。。那就是用横坐标与纵坐标匹配,x与y坐标的连线就是该点,然后就是求最少点覆盖问题,从而根据最少点覆盖=最大匹配,转化成了二分图最大匹配问题。代码如下:
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include <map> #include <algorithm> using namespace std; int mp[500][500], link[500], vis[500], n; int dfs(int a) { int i, j; for(i=1;i<=n;i++) { if(!vis[i]&&mp[a][i]) { vis[i]=1; if(link[i]==-1||dfs(link[i])) { link[i]=a; return 1; } } } return 0; } int hungary() { int i, ans=0; memset(link,-1,sizeof(link)); for(i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) { ans++; } } return ans; } int main() { int x, y, m; while(scanf("%d%d",&n,&m)!=EOF) { memset(mp,0,sizeof(mp)); while(m--) { scanf("%d%d",&x,&y); mp[x][y]=1; } printf("%d\n",hungary()); } return 0; }
相关文章推荐
- POJ 3041 Asteroids 匈牙利算法 二分图最大匹配
- POJ 3041 Asteroids【二分图最大匹配】
- 【网络流#6】POJ 3041 Asteroids 二分图最大匹配 - 《挑战程序设计竞赛》例题
- 二分图最大匹配(匈牙利算法) POJ 3041 Asteroids
- Asteroids - poj 3041(二分图最大匹配问题)
- Asteroids(poj 3041,二分图最大匹配)
- POJ 3041 Asteroids(二分图的最大匹配)
- POJ 3041 Asteroids / UESTC 253 Asteroids(二分图最大匹配,最小点匹配)
- (模板题)poj 3041 Asteroids(二分图的最大匹配匈牙利算法)
- 【二分图+最大匹配】北大 poj 3041 Asteroids
- Asteroids(POJ--3041 【二分图的最小顶点集 = 二分图的最大匹配】
- POJ训练计划3041_Asteroids(二分图/最小点覆盖=最大匹配)
- POJ 3041 Asteroids 二分图最大匹配
- POJ 3041 Asteroids 二分图最大匹配
- POJ 3041 Asteroids【二分图最大匹配.最小点覆盖】
- POJ 3041 Asteroids (二分图最大匹配)
- [二分图最大匹配] poj 3041 Asteroids
- poj 3041 Asteroids 初级-》二分图最大匹配
- poj - 3041 Asteroids (二分图最大匹配+匈牙利算法)
- poj 3041 Asteroids(二分图最大匹配)