题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3729
解题思路:节点i对Xi~Yi之间的每一个点都连一条边,这样问题就转化成二分图的最大匹配了。字典序最大,这里可以根据匈牙利算法的特点,从n枚举到1即可。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 100005;
struct node
{
int x,y;
}a[105];
int n,m,g[65][maxn];
int match[maxn],res[65];
bool vis[maxn];
bool dfs(int u)
{
for(int i = a[u].x; i <= a[u].y; i++)
{
if(vis[i] == false)
{
vis[i] = true;
if(match[i] == -1 || dfs(match[i]))
{
match[i] = u;
res[u] = 1;
return true;
}
}
}
return false;
}
void Max_Match()
{
int ans = 0;
memset(match,-1,sizeof(match));
memset(res,-1,sizeof(res));
for(int i = n; i >= 1; i--)
{
memset(vis,false,sizeof(vis));
if(dfs(i)) ans++;
}
printf("%d\n",ans);
for(int i = 1,cnt = 0; i <= n; i++)
if(res[i] == 1)
{
cnt++;
if(cnt == ans) printf("%d\n",i);
else printf("%d ",i);
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i = 1; i <= n; i++)
scanf("%d%d",&a[i].x,&a[i].y);
Max_Match();
}
return 0;
}