hdu 3729(二分图最大匹配+最大字典序)

来源:互联网 发布:php应用开发 编辑:程序博客网 时间:2024/06/10 03:24

题目链接: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;}


1 0