• HDU 2063 过山车(匈牙利算法模板)


    http://acm.hdu.edu.cn/showproblem.php?pid=2063

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #define maxn 1000//表示x集合和y集合中顶点的最大个数!
     int nx,ny;//x集合和y集合中顶点的个数
     int edge[maxn][maxn];//edge[i][j]为1表示ij可以匹配
     int cx[maxn],cy[maxn];//用来记录x集合中匹配的y元素是哪个!
     int visited[maxn];//用来记录该顶点是否被访问过!
     int path(int u)
     {
         int v;
         for(v=0;v<ny;v++)
         {
             if(edge[u][v]&&!visited[v])
             {
                 visited[v]=1;
                if(cy[v]==-1||path(cy[v]))//如果y集合中的v元素没有匹配或者是v已经匹配,但是从cy[v]中能够找到一条增广路
                 {
                     //cx[u]=v;这是无向图中才要的
                     cy[v]=u;
                     return 1;
                 }
             }
         }
         return 0;
     }
     int maxmatch()
     {
         int res=0,i;
         for(i=0;i<maxn;i++)
            cx[i]=cy[i]=-1;//初始值为-1表示两个集合中都没有匹配的元素!
         for(i=0;i<=nx;i++)
         {
             if(cx[i]==-1)
             {
                 memset(visited,0,sizeof(visited));
                 res+=path(i);
             }
         }
         return res;
     }
     int main()
     {
         int i,j,x,y,ans,K,M,N;
         while(scanf("%d",&K),K)
         {
             scanf("%d%d",&M,&N);
             ny=nx=M+N;
             memset(edge,0,sizeof(edge));
             for(i=0;i<K;i++)
             {
                    scanf("%d%d",&x,&y);
                    edge[x][y]=1;
             }
             /*for(i=0;i<nx;i++)
                for(j=0;j<ny;j++)
                if(edge[i][j])printf("%d-->%d
    ",i,j);*/
             ans=maxmatch();
             printf("%d
    ",ans);
         }
         return 0;
     }
    View Code
  • 相关阅读:
    布尔值数据类型
    数据类型
    while循环。for循环
    对于元素类型为集合的List进行排序
    进程和线程之由来
    ExecutorService的关闭
    Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
    什么是设计模式
    java多线程的原子性
    OutputStream的flush()方法
  • 原文地址:https://www.cnblogs.com/huzhenbo113/p/3283569.html
Copyright © 2020-2023  润新知