码迷,mamicode.com
首页 > 编程语言 > 详细

[蒟蒻修炼计划][模板]匈牙利算法

时间:2016-07-09 17:57:20      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:

JSOI写匈牙利的时候写炸了QAQ,我要好好补基础。

时间复杂度O(m√n)

 1 #include<set>
 2 #include<cmath>
 3 #include<ctime>
 4 #include<stack>
 5 #include<queue>
 6 #include<cstdio>
 7 #include<vector>
 8 #include<cstring>
 9 #include<cstdlib>
10 #include<iostream>
11 #include<algorithm>
12 #define N 3001
13 #define M 200001
14 using namespace std;
15 struct graph{
16     int nxt,to;
17 }e[M];
18 int g[N],fr[N],n,m,cnt;
19 bool u[N];
20 inline void addedge(int x,int y){
21     e[++cnt].nxt=g[x];g[x]=cnt;e[cnt].to=y;
22 }
23 inline bool match(int x){
24     for(int i=g[x];i;i=e[i].nxt)
25         if(!u[e[i].to]){
26             u[e[i].to]=true;
27             if(!fr[e[i].to]||match(fr[e[i].to])){
28                 fr[e[i].to]=x;return true;
29             }
30         }
31     return false;
32 }
33 inline int hungary(){
34     int ret=0;
35     for(int i=1;i<=n;i++){
36         fill(u+1,u+1+n,false);
37         if(match(i)) ret++;
38     }
39     return ret;
40 }
41 inline void init(){
42     scanf("%d%d",&n,&m);
43     for(int i=1,j,k;i<=m;i++){
44         scanf("%d%d",&j,&k);
45         addedge(j,k);
46     }
47     printf("%d",hungary());
48 }
49 int main(){
50     freopen("hungary.in","r",stdin);
51     freopen("hungary.out","w",stdout);
52     init();
53     fclose(stdin);
54     fclose(stdout);
55 }

 

[蒟蒻修炼计划][模板]匈牙利算法

标签:

原文地址:http://www.cnblogs.com/AireenYe/p/5656237.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!