zoukankan      html  css  js  c++  java
  • HDU 3729 二分匹配 反向匹配

    题意:

    给定 n个学生 说的 自己 考试排名的 可能范围

    确定最多几个人说真话

    如果有多种答案,输出字典序最大的那种( 要求字典序最大,所以solve中从最大字典序开始匹配)

    思路:

    题目给定  点 映射到 数轴的区间 上, 问最多多少点可以成功映射到数轴上

    很显然  点就是 x集  , 整个数轴 就是 y集 , 点对应的整个区间就是映射的边 ,所以直接有了一个二分图

    #include<iostream>
    #include<string.h>
    #include<stdio.h>
    using namespace std;
    
    #define N 100100
    #define M 65
    struct node{
    	int x,y;
    }len[M];
    int n;
    
    int lef[N],match[M];
    bool vis[N];
    bool dfs(int x){
    
    	for(int i=len[x].x; i<= len[x].y; i++){
    		if(!vis[i])
    		{
    			vis[i] = true;
    			if(lef[i] == -1 || dfs(lef[i]))	{
    				lef[i] = x;
    				match[x] = i;
    				return true;
    			}
    		}
    	}
    	return false;
    }
    int solve(){
    	memset(lef, -1, sizeof(lef));
    	memset(match,-1,sizeof(match));
    	int ans = 0;
    	for(int i = n-1 ; i >= 0; i-- ){
    		memset(vis,0,sizeof(vis));
    		ans += dfs(i);
    	}
    	return ans;
    }
    int main(){
    	int i,T;scanf("%d",&T);
    	while(T--){
    		scanf("%d",&n);
    		for(i=0;i<n;i++)scanf("%d %d",&len[i].x,&len[i].y);
    		int ans = solve();
    		printf("%d
    ",ans);
    		for(i=0;i<n;i++)
    			if(match[i] != -1){
    				ans--;
    				printf("%d",i+1);
    				if(ans)printf(" ");
    				else   printf("
    ");
    			}
    
    	}
    	return 0;
    }


     

  • 相关阅读:
    python验证卡普耶卡(D.R.Kaprekar)6174猜想
    关于java环境变量配置出现javac命令无法运行的解决办法
    关于QQ农场牧场等曾经流行的游戏的一些见解
    个人博客九
    个人博客八
    个人博客七
    个人博客六
    第十一周学习进度
    个人博客五
    个人博客四
  • 原文地址:https://www.cnblogs.com/riasky/p/3372041.html
Copyright © 2011-2022 走看看