HDU 3729-I'm Telling the Truth-周赛4补题-二分图最大匹配-邻接表
2015-08-24 10:12
483 查看
题意:
新学期开学,老师想知道各个同学的分数,同学们不想把自己的真实分数告诉老师,只和老师说自己的排名在哪个范围内,有些同学和老师说的数据是不真实的,现在让你找到说的信息是真的同学的数目和序号,有多种情况要选择序号字典序大那种,注意,每个排名只有一个同学
思路:
二分图的最大匹配;
要注意是要字典序大的,所以要反着搜
CODE
新学期开学,老师想知道各个同学的分数,同学们不想把自己的真实分数告诉老师,只和老师说自己的排名在哪个范围内,有些同学和老师说的数据是不真实的,现在让你找到说的信息是真的同学的数目和序号,有多种情况要选择序号字典序大那种,注意,每个排名只有一个同学
思路:
二分图的最大匹配;
要注意是要字典序大的,所以要反着搜
CODE
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; int n; int cnt; int head[110000],vis[110000],link[110000]; struct node { int u; int v; int next; }edge[110000];///用邻接表存储 void add(int u, int v)///添加,逆序 { edge[cnt].v = v; edge[cnt].next = head[u]; head[u] = cnt++; } int dfs(int u) { int i; for(i = head[u]; i!=-1; i = edge[i].next) { int v = edge[i].v; if(!vis[v]) { vis[v] = 1; if(link[v]==-1||dfs(link[v])) { link[v] =u; return 1; } } } return 0; } void hungary()///二分图最大匹配 { int a[70]; int i,ans = 0; memset(link,-1,sizeof(link)); for(i = n; i >= 1; i--)///反着,为了字典序 { memset(vis,0,sizeof(vis)); if(dfs(i)) a[ans++] = i; } printf("%d\n",ans); sort(a,a+ans); for(i = 0; i < ans; i++) { printf("%d",a[i]); if(i < ans-1) printf(" "); } printf("\n"); } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d",&n); memset(head,-1,sizeof(head)); int i, j; for(i = 1;i <= n; i++) { int u, v; scanf("%d%d",&u,&v); for(j = u; j <= v; j++) { add(i,j); } } hungary(); } return 0; }
相关文章推荐
- linux
- Java 内存分配全面浅析
- Objective-C运行时定义了几种重要的类型。
- Android 线程Thread的2种实现方法
- C#中StreamWriter与BinaryWriter的区别兼谈编码。
- 软件开发需要学习什么?
- PS怎么把图片处理的更清晰
- Latex的biography中作者照片的插入
- 如何实现视频的快进快退功能(整理)
- HDOJ 题目 4749 Parade Show(KMP)
- oracle 安装后需要调整内容
- Nexus启动报错:Unsupported major.minor version 51.0
- fir.im Weekly - 新开发时代,每个人都在创造
- C#中对属性和字段的理解
- bzoj4003
- 使用Open Flash Chart(OFC)制作图表(Struts2处理)
- UVA 10288 Coupons 彩票 (数学期望)
- session过期后含用iframe页面如何自动跳转到登陆页
- 探讨iOS某个像素点是否显示依据,以摸索为什么iOS没适配的应用在iphone6上面线的粗细会不稳定。有的线会变粗
- 关于瀑布流