hdu 3729 最大匹配

  此题是我AC的HDU的201道题目。泪流满面啊!

  字典序最大(最小)真是个烦人的东西。

  学生i与其对应的分数区间的每个点连一条边。字典序最大,编号最大的学生开始匹配。

  HK无法AC啊,试了很久。我不会说,能过样例。

  最后用了DFS版的匈牙利算法过了。人们说这个代码简洁。不过我一般都用HK,时间复杂度低。今天发现了这个,还是有收获的。下次什么字典序,就用匈牙利。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 #include<algorithm>
 6 using namespace std;
 7 const int N=65,M=110050,INF=0x3f3f3f3f;
 8 bool bmask[M];
 9 int cx[N],cy[M];
10 int nx,ans;
11 vector<int> bmap[N];
12 int findpath(int u)
13 {
14     int i,j;
15     for(j=0;j<bmap[u].size();j++)
16     {
17         i=bmap[u][j];
18         if(!bmask[i])
19         {
20             bmask[i]=1;
21             if(cy[i]==-1||findpath(cy[i]))
22             {
23                 cy[i]=u; cx[u]=i;
24                 return 1;
25             }
26         }
27     }
28     return 0;
29 }
30 void maxmatch()
31 {
32     int i ,j;
33     ans=0;
34     memset(cx,-1,sizeof(cx));
35     memset(cy,-1,sizeof(cy));
36     for(i=nx;i>=1;i--)
37     {
38         if(cx[i]==-1)
39         {
40             memset(bmask,0,sizeof(bmask));
41             ans+=findpath(i);
42         }
43     }
44 }
45 int main()
46 {
47     //freopen("test.txt","r",stdin);
48     int cas,i,j,k,n,a,b;
49     scanf("%d",&cas);
50     while(cas--)
51     {
52         scanf("%d",&n);
53         for(i=1;i<=n;i++)
54         {
55             bmap[i].clear();
56             scanf("%d%d",&a,&b);
57             for(k=a;k<=b;k++)
58             bmap[i].push_back(k);
59         }
60         nx=n;
61         maxmatch();
62         printf("%d\n",ans);
63         for(i=1;i<=nx;i++)
64         {
65             if(cx[i]!=-1)
66             {
67                 printf("%d",i);
68                 ans--;
69                 if(ans) printf(" ");
70                 else printf("\n");
71             }
72         }
73     }
74     return 0;
75 }

时间: 2024-10-11 06:49:14

hdu 3729 最大匹配的相关文章

HDU 3729 I&#39;m Telling the Truth(二分图最大匹配+结果输出)

题目地址:HDU 3729 二分图最大匹配+按字典序输出结果.只要从数字大的开始匹配就可以保证字典序最大了.群里有人问..就顺手写了这题.. 代码如下: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int vis[110000], head[110000], cnt, link[110000], n, a[

HDU - 3729 I&#39;m Telling the Truth(二分匹配)

题意:有n个人,每个人给出自己的名次区间,问最多有多少个人没撒谎,如果有多解,输出字典序最大的解. 分析: 1.因为字典序最大,所以从后往前分析. 2.假设后面的人没说谎,并将此作为已知条件,然后从后往前依次给每个人找到合适的名次,输出所有能找到合适名次的人即可. 3.假定给第i个人安排名次,第i+1~n个人名次已经安排好,假如第i个人想占的名次被第j个人所占,那就从第j个人可以占的名次中再找个合适的名次给j,然后把空出来的这个名次给i,如果i可以占的所有名次都被占且占领的人找不到其他可以占的名

hdu 3729 I&#39;m Telling the Truth

I'm Telling the Truth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1377    Accepted Submission(s): 700 Problem Description After this year’s college-entrance exam, the teacher did a survey in

HDU 3729 I&#39;m Telling the Truth (二分匹配)

题意:给定 n 个人成绩排名区间,然后问你最多有多少人成绩是真实的. 析:真是没想到二分匹配,....后来看到,一下子就明白了,原来是水题,二分匹配,只要把每个人和他对应的区间连起来就好,跑一次二分匹配,裸的. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #inc

hdu 1083 最大匹配

题意:N个学生 P 个课程  求最大匹配 3 3 //学生 课程 3 1 2 3 //课程1 匹配学生1 2 3 2 1 2 1 1典型的匹配没什么好说的 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 #include<iostream

hdu 1179 最大匹配

题意:n个ren m个棍子 每个棍子可以与i个人结合 问最大有多少个结合#include<iostream> #include<cmath> using namespace std; int map[111][111]; int fa[111]; int v[111]; int n,m; int dfs(int x) { for(int i=1;i<=n;i++) { if(map[x][i]&&!v[i])//回溯时i不能再匹配 { v[i]=1; if(!

【I&#39;m Telling the Truth】【HDU - 3729】 【匈牙利算法,DFS】

思路 题意:该题主要说几个同学分别说出自己的名次所处区间,最后输出可能存在的未说谎的人数及对应的学生编号,而且要求字典序最大. 思路:刚刚接触匈牙利算法,了解的还不太清楚,附一个专门讲解匈牙利算法的博文,个人认为讲的比较清晰. AC代码 #include<iostream> #include<cstdio> #include<cstring> using namespace std; int T, n; struct Stue { int l, r; }; Stue p

hdu 3729(二分图最大匹配)

I'm Telling the Truth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2006    Accepted Submission(s): 1011 Problem Description After this year’s college-entrance exam, the teacher did a survey i

HDU 2853 最大匹配&amp;KM模板

http://acm.hdu.edu.cn/showproblem.php?pid=2853 这道题初看了没有思路,一直想的用网络流如何解决 参考了潘大神牌题解才懂的 最大匹配问题KM 还需要一些技巧来解决最小变动, 做法是:把原先的邻接矩阵每个数扩大k倍(k>n) 为了突出原先的选择,也就是同等情况下优先选择原来的方案 给原来的方案对应矩阵内的数据+1 那么 最终得出的最大匹配值/k=真实的最大匹配 最终得出的最大匹配值%k=原来的方案采用了几个 这里的KM留下来做模板 /* 二分图最佳匹配