• hdoj 2063 过山车【匈牙利算法+邻接矩阵or邻接表】


    过山车

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 13476    Accepted Submission(s): 5901


    Problem Description
    RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了。可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐。但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Grass只愿意和linle或LL做partner,PrincessSnow愿意和水域浪子或伪酷儿做partner。考虑到经费问题,boss刘决定只让找到partner的人去坐过山车,其他的人,嘿嘿,就站在下面看着吧。聪明的Acmer,你可以帮忙算算最多有多少对组合可以坐上过山车吗?
     
    Input
    输入数据的第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的人数。0<K<=1000
    1<=N 和M<=500.接下来的K行,每行有两个数,分别表示女生Ai愿意和男生Bj做partner。最后一个0结束输入。
     
    Output
    对于每组数据,输出一个整数,表示可以坐上过山车的最多组合数。
     
    Sample Input
    6 3 3
    1 1
    1 2
    1 3
    2 1
    2 3
    3 1
    0
     
    Sample Output
    3
     
    匈牙利算法:
       此题就是匈牙利算法的模板
     邻接矩阵AC代码:
    #include<stdio.h>
    #include<string.h>
    #define MAX 1100
    int map[MAX][MAX];
    int vis[MAX];//记录这个女生是否已经有搭档 
    int girl[MAX];//记录女孩当前跟那个男生搭档 
    int k,n,m;
    int find(int x)//判断当前男生可以和那个女生搭档如果有搭档返回1 
    {              //没有搭档返回0 
    	int i,j;
    	for(i=1;i<=m;i++)
    	{
    		if(map[x][i]&&!vis[i])//如果两个人情投意合并且女生没有被标记
    		{                     //(此处标记的意思是女生和第i个男生情投意合并且已经组成了搭档) 
    			vis[i]=1;
    			if(girl[i]==0||find(girl[i]))//如果女生没有搭档或者可以换个搭档 
    			{
    				girl[i]=x;
    				return 1;
    			}
    		}
    	}
    	return 0;
    }
    int main()
    {
    	int j,i,t,x,y,sum;
    	while(scanf("%d",&k),k)
    	{
    		scanf("%d%d",&n,&m);
    		memset(map,0,sizeof(map));
    		memset(girl,0,sizeof(girl));
    		while(k--)
    		{
    			scanf("%d%d",&x,&y);
    			map[x][y]=1;
    		}
    		sum=0;
    		for(i=1;i<=n;i++)
    		{
    			memset(vis,0,sizeof(vis));
    			if(find(i))
    			sum++;
    		}
    		printf("%d
    ",sum);
    	}
    	return 0;
    }
    

      邻接表AC代码:

    #include<stdio.h>
    #include<string.h>
    #define MAX 1100
    int girl[MAX],vis[MAX];
    int head[MAX],cnt;
    int k,m,n;
    struct node
    {
    	int u,v;
    	int next;
    }edge[MAX];
    void add(int u,int v)
    {
    	edge[cnt].u=u;
    	edge[cnt].v=v;
    	edge[cnt].next=head[u];
    	head[u]=cnt++;
    }
    int find(int x)
    {
    	int i,j;
    	for(i=head[x];i!=-1;i=edge[i].next)
    	{
    		int y=edge[i].v;
    		if(!vis[y])
    		{
    			vis[y]=1;
    			if(girl[y]==0||find(girl[y]))
    		    {
    		    	girl[y]=x;
    		    	return 1;
    		    }
    		}
    	}
    	return 0;
    }
    int main()
    {
    	int i,j;
    	while(scanf("%d",&k),k)
    	{
    		memset(head,-1,sizeof(head));
    		memset(girl,0,sizeof(girl));
    		cnt=0;
    		scanf("%d%d",&n,&m);
    		for(i=0;i<k;i++)
    		{
    			int a,b;
    			scanf("%d%d",&a,&b);
    			add(a,b);
    		}
    		int sum=0;
    		for(i=1;i<=n;i++)
    		{
    			memset(vis,0,sizeof(vis));
    			if(find(i))
    			sum++;
    		}
    		printf("%d
    ",sum);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    python设计模式之命令模式
    [Shell] 生成日期列表
    [Python] Python 获取文件路径
    [Search] 倒排索引与bool检索
    [NLP] Reformer: The Efficient Transformer
    [Alg] 随机抽样完备算法-蓄水池算法 Reservoir Sampling
    [Chaos] 混沌数学学习资料
    [Alg] 文本匹配-多模匹配-WM算法
    [Alg]文本匹配-单模匹配-Sunday算法
    [Alg] 文本匹配-多模匹配-AC自动机
  • 原文地址:https://www.cnblogs.com/tonghao/p/4615918.html
Copyright © 2020-2023  润新知