首页 > 代码库 > 【二分图】【最大匹配】【匈牙利算法】洛谷 P2071 座位安排 seat.cpp/c/pas
【二分图】【最大匹配】【匈牙利算法】洛谷 P2071 座位安排 seat.cpp/c/pas
∵每个座位可以坐俩人,所以拆点最大匹配。
1 #include<cstdio> 2 #include<vector> 3 #include<cstring> 4 using namespace std; 5 #define N 2001 6 vector<int>G[N<<2]; 7 typedef vector<int>::iterator ITER; 8 int mat[N<<2]; 9 bool vis[N<<2];10 int n,x,y;11 bool dfs(int U)12 {13 for(ITER it=G[U].begin();it!=G[U].end();it++)14 if(!vis[*it])15 {16 vis[*it]=1;17 if(mat[*it]==-1||dfs(mat[*it]))18 {19 mat[*it]=U;20 return 1;21 }22 }23 return 0;24 }25 int max_match()26 {27 memset(mat,-1,sizeof(mat)); int res=0;28 for(int i=1;i<=(n<<1);i++)29 {30 memset(vis,0,sizeof(vis));31 if(dfs(i)) res++;32 }33 return res;34 }35 int main()36 {37 scanf("%d",&n);38 for(int i=1;i<=(n<<1);i++)39 {40 scanf("%d%d",&x,&y);41 G[i+(n<<1)].push_back(x);42 G[i+(n<<1)].push_back(x+n);43 G[i+(n<<1)].push_back(y);44 G[i+(n<<1)].push_back(y+n);45 G[x].push_back(i+(n<<1));46 G[x+n].push_back(i+(n<<1));47 G[y].push_back(i+(n<<1));48 G[y+n].push_back(i+(n<<1));49 }50 printf("%d\n",max_match());51 for(;;);52 return 0;53 }
【二分图】【最大匹配】【匈牙利算法】洛谷 P2071 座位安排 seat.cpp/c/pas
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。