• hdu 2063+hdu 1083(最大匹配数)


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063

    二分匹配水题,求最大匹配数(即求边数最多的匹配),匈牙利算法实现。。

    View Code
     1 #include<iostream>
     2 const int MAXN=507;
     3 using namespace std;
     4 int k,m,n;
     5 int map[MAXN][MAXN];
     6 int cx[MAXN],cy[MAXN];
     7 int mark[MAXN];
     8 
     9 int dfs(int u){
    10     for(int v=0;v<n;v++){
    11         if(map[u][v]&&!mark[v]){
    12             mark[v]=1;
    13             if(cy[v]==-1||dfs(cy[v])){
    14                 cx[u]=v;
    15                 cy[v]=u;
    16                 return 1;
    17             }
    18         }
    19     }
    20     return 0;
    21 }
    22 
    23 int MaxMatch(){
    24     int res=0;
    25     memset(cx,-1,sizeof(cx));
    26     memset(cy,-1,sizeof(cy));
    27     for(int i=0;i<=m;i++){
    28         if(cx[i]==-1){
    29             memset(mark,0,sizeof(mark));
    30             res+=dfs(i);
    31         }
    32     }
    33     return res;
    34 }
    35 
    36 
    37 int main(){
    38     while(~scanf("%d",&k)&&k){
    39         scanf("%d%d",&m,&n);
    40         int x,y;
    41         memset(map,0,sizeof(map));
    42         for(int i=0;i<k;i++){
    43             scanf("%d%d",&x,&y);
    44             map[x-1][y-1]=1;//这里只需单向就行了,因为dfs是就是从X集合的未盖点出发的
    45         }
    46         int ans=MaxMatch();
    47         printf("%d\n",ans);
    48     }
    49     return 0;
    50 }
    51 
    52 
    53 
    54     

     题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1083

    View Code
     1 #include<iostream>
     2 const int MAXN=307;
     3 using namespace std;
     4 int cx[MAXN],cy[MAXN];
     5 int map[MAXN][MAXN];
     6 int mark[MAXN];
     7 int n,m;
     8 
     9 int dfs(int u){
    10     for(int v=1;v<=m;v++){
    11         if(map[u][v]&&!mark[v]){
    12             mark[v]=1;
    13             if(cy[v]==-1||dfs(cy[v])){
    14                 cy[v]=u;
    15                 cx[u]=v;
    16                 return 1;
    17             }
    18         }
    19     }
    20     return 0;
    21 }
    22 
    23 int MaxMatch(){
    24     int res=0;
    25     memset(cx,-1,sizeof(cx));
    26     memset(cy,-1,sizeof(cy));
    27     for(int i=1;i<=n;i++){
    28         if(cx[i]==-1){
    29             memset(mark,0,sizeof(mark));
    30             res+=dfs(i);
    31         }
    32     }
    33     return res;
    34 }
    35 
    36 int main(){
    37     int _case;
    38     scanf("%d",&_case);
    39     while(_case--){
    40         scanf("%d%d",&n,&m);
    41         memset(map,0,sizeof(map));
    42         for(int i=1;i<=n;i++){
    43             int t;
    44             scanf("%d",&t);
    45             while(t--){
    46                 int x;
    47                 scanf("%d",&x);
    48                 map[i][x]=1;
    49             }
    50         }
    51         int ans=MaxMatch();
    52         if(ans==n){
    53             printf("YES\n");
    54         }else 
    55             printf("NO\n");
    56     }
    57     return 0;
    58 }
    59 
    60                 
    61             
  • 相关阅读:
    [openshift]openshfit OKD的安装
    [Docker]记一次使用jenkins将镜像文件推送到Harbor遇到的问题
    [k8s]创建Kubernetes的ssl/tls用户
    [k8s]ubuntu18 + Heketi + Glsuterfs的独立部署
    [k8s]kubernetes dashboard的安装
    [K8S]kubeadm国内镜像安装方式
    [K8S]污点调度
    [GO]解决golang.org/x/ 下包下载不下来的问题
    [GO]删除切片的某个值
    layui静态初始化渲染表单样式
  • 原文地址:https://www.cnblogs.com/wally/p/2990397.html
Copyright © 2020-2023  润新知