二部图 匈牙利算法

来源:互联网 发布:小米网上商城软件下载 编辑:程序博客网 时间:2024/04/28 05:13

匈牙利算法:http://www.renfei.org/blog/bipartite-matching.html 

http://www.codeceo.com/article/bgraph-match-algorithm.html

http://dsqiu.iteye.com/blog/1689505

一道练习题: http://blog.sina.com.cn/s/blog_ac5ed4f30101ewjk.html


DFS:

#include <iostream>#include <cstring>using namespace std;#define MAX 501  int map[MAX][MAX]; int cx[MAX],cy[MAX]; bool vis[MAX];   int n,m; int path(int u){for (int v=1;v<=m;v++){ if (map[u][v]&&!vis[v]){vis[v]=1; if (cy[v]==-1||path(cy[v]))  {cx[u]=v; cy[v]=u; return 1;  }}}return 0; }int hungarian(){int ans=0; memset(cx,-1,sizeof(cx)); memset(cy,-1,sizeof(cy));   for (int i=1;i<=n;i++) {  if (cx[i]==-1){memset(vis,0,sizeof(vis)); ans+=path(i); }}return ans;  }int main(){int k,a,b; while (cin>>k>>n>>m){  memset(map,0,sizeof(map)); for (int i=0;i<k;i++){cin>>a>>b; map[a][b]=1;  }cout<<hungarian()<<endl; }return 0; }


使用vector<int>::iterator迭代器


#include <iostream>   #include <vector>#include <cstring>   using namespace std;  #define MAX 501    #define MAXK 1001typedef vector<int>::iterator iterator_t;vector<int>G[MAX]; int cx[MAX],cy[MAX];   bool vis[MAX];      int n,m,cnt;   int path(int u)  {  for (iterator_t i=G[u].begin();i!=G[u].end();i++)    {    int v=*i;    if (!vis[v])   {  vis[v]=1;   if (cy[v]==-1||path(cy[v]))    {  cx[u]=v;   cy[v]=u;   return 1;    }  }  }  return 0;   }  int hungarian()  {  int ans=0;   memset(cx,-1,sizeof(cx));   memset(cy,-1,sizeof(cy));     for (int i=1;i<=n;i++)   {    if (cx[i]==-1)  {  memset(vis,0,sizeof(vis));   ans+=path(i);   }  }  return ans;    }   int main()  {  int k,a,b;   while (cin>>k>>n>>m)  {    for (int i=0;i<MAX;i++) G[i].clear(); cnt=0;  for (int i=0;i<k;i++)  {  cin>>a>>b;    G[a].push_back(b); }   cout<<hungarian()<<endl;   }  return 0;   }


链表结构: 

#include <iostream>  #include <cstring>  using namespace std;  #define MAX 501    #define MAXK 1001int head[MAX];  int cx[MAX],cy[MAX];   bool vis[MAX];     int n,m,cnt;   struct node{int v,next; }edge[MAXK];void add(int u,int v){node E={v,head[u]}; edge[cnt]=E; head[u]=cnt++; } int path(int u)  {  for (int i=head[u];i!=-1;i=edge[i].next)   {    int v=edge[i].v; if (!vis[v])   {  vis[v]=1;   if (cy[v]==-1||path(cy[v]))    {  cx[u]=v;   cy[v]=u;   return 1;    }  }  }  return 0;   }  int hungarian()  {  int ans=0;   memset(cx,-1,sizeof(cx));   memset(cy,-1,sizeof(cy));     for (int i=1;i<=n;i++)   {    if (cx[i]==-1)  {  memset(vis,0,sizeof(vis));   ans+=path(i);   }  }  return ans;    }   int main()  {  int k,a,b;   while (cin>>k>>n>>m)  {    cnt=0; memset(head,0xff,sizeof(head));    for (int i=0;i<k;i++)  {  cin>>a>>b;   add(a,b); }  cout<<hungarian()<<endl;   }  return 0;   }

0 0
原创粉丝点击