首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

poj 3041 Asteroids (匈牙利算法-二分图最大婚配)

2013-09-08 
poj 3041 Asteroids (匈牙利算法---二分图最大匹配)题目:http://poj.org/problem?id3041在二分图中,最小

poj 3041 Asteroids (匈牙利算法---二分图最大匹配)

题目:http://poj.org/problem?id=3041

在二分图中,最小点覆盖数=最大匹配数,把光束模型成顶点,小星星模型成连接对应光束的边,这样,等价于求最小点覆盖。

#include<iostream>#include<vector>using namespace std;const int MAXN=501*2;vector<int> G[MAXN];int N,K;int match[MAXN];bool used[MAXN];void add_edge(int u,int v){G[u].push_back(v);G[v].push_back(u);}bool dfs(int v){used[v]=1;for(int i=0;i<G[v].size();i++){int u=G[v][i],w=match[u];if(w<0 || !used[w] && dfs(w)){ match[u]=v;match[v]=u;cout<<u<<" "<<v<<endl; return 1;}}return 0;}int main(){while(cin>>N>>K){for(int i=0;i<K;i++){int u,v;cin>>u>>v;add_edge(u,v+N);}int res=0;memset(match,-1,sizeof(match));for(int v=1;v<=N*2;v++){if(match[v]<0){memset(used,0,sizeof(used));if(dfs(v)) res++;}}cout<<res<<endl;}return 0;}

关于匈牙利算法:

很重要的一个概念就是 增广路(交错路),要明白为什么每次取反之后匹配数会增加一,具体的算法解释自己谷歌吧。

热点排行