Escape
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2593 Accepted Submission(s): 708
Problem Description
2012 If this is the end of the world how to do? I do not know how. But now scientists have found that some stars, who can live, but some people do not fit to live some of the planet. Now scientists want your help, is to determine what all of people can live in these planets.
Input
More set of test data, the beginning of each data is n (1 <= n <= 100000), m (1 <= m <= 10) n indicate there n people on the earth, m representatives m planet, planet and people labels are from 0. Here are n lines, each line represents a suitable living conditions of people, each row has m digits, the ith digits is 1, said that a person is fit to live in the ith-planet, or is 0 for this person is not suitable for living in the ith planet.
The last line has m digits, the ith digit ai indicates the ith planet can contain ai people most..
0 <= ai <= 100000
The last line has m digits, the ith digit ai indicates the ith planet can contain ai people most..
0 <= ai <= 100000
Output
Determine whether all people can live up to these stars
If you can output YES, otherwise output NO.
If you can output YES, otherwise output NO.
Sample Input
1 1
1
1
2 2
1 0
1 0
1 1
Sample Output
YES
NO
Source
Recommend
lcy
发现可以合并点,
因为m<=10.
所以用二进制记录。
在n个点中,如果是一样的就合并。
这样最多是1024+m+2个点。
但是这题还是很坑。。。。在HDU上用G++交无论如何都是TLE的。直接读入数据输出都是TLE.
改成C++就AC了。。
1,最大流:
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; const int VM=101000; const int EM=500010; const int INF=0x3f3f3f3f; int n,m,cnt,head[VM]; int dep[VM],gap[VM],cur[VM],aug[VM],pre[VM]; //dep表示每个点的距离标记,gap表示距离为i的点有多少个,cur用于当前孤优化, //aug记录找到的增广路流量,path记录找到的增广路的路径。 struct Edge{ int u,v,nxt; int cap; }edge[EM]; void addedge(int cu,int cv,int cw){ edge[cnt].u=cu; edge[cnt].v=cv; edge[cnt].cap=cw; edge[cnt].nxt=head[cu]; head[cu]=cnt++; edge[cnt].u=cv; edge[cnt].v=cu; edge[cnt].cap=0; edge[cnt].nxt=head[cv]; head[cv]=cnt++; } int src,des; int SAP(int n){ int max_flow=0,u=src,v; int id,mindep; aug[src]=INF; pre[src]=-1; memset(dep,0,sizeof(dep)); memset(gap,0,sizeof(gap)); gap[0]=n; for(int i=0;i<=n;i++) cur[i]=head[i]; // 初始化当前弧为第一条弧 while(dep[src]<n){ int flag=0; if(u==des){ max_flow+=aug[des]; for(v=pre[des];v!=-1;v=pre[v]){ // 路径回溯更新残留网络 id=cur[v]; edge[id].cap-=aug[des]; edge[id^1].cap+=aug[des]; aug[v]-=aug[des]; // 修改可增广量,以后会用到 if(edge[id].cap==0) // 不回退到源点,仅回退到容量为0的弧的弧尾 u=v; } } for(int i=cur[u];i!=-1;i=edge[i].nxt){ v=edge[i].v; // 从当前弧开始查找允许弧 if(edge[i].cap>0 && dep[u]==dep[v]+1){ // 找到允许弧 flag=1; pre[v]=u; cur[u]=i; aug[v]=min(aug[u],edge[i].cap); u=v; break; } } if(!flag){ if(--gap[dep[u]]==0) /* gap优化,层次树出现断层则结束算法 */ break; mindep=n; cur[u]=head[u]; for(int i=head[u];i!=-1;i=edge[i].nxt){ v=edge[i].v; if(edge[i].cap>0 && dep[v]<mindep){ mindep=dep[v]; cur[u]=i; // 修改标号的同时修改当前弧 } } dep[u]=mindep+1; gap[dep[u]]++; if(u!=src) // 回溯继续寻找允许弧 u=pre[u]; } } return max_flow; } int main(){ //freopen("input.txt","r",stdin); int num[1025],a[12],bit[12]; bit[0]=1; for(int i=1;i<=10;i++) bit[i]=bit[i-1]<<1; while(~scanf("%d%d",&n,&m)){ cnt=0; memset(head,-1,sizeof(head)); memset(num,0,sizeof(num)); for(int i=1;i<=n;i++){ //缩点 int tmp=0; for(int j=0;j<m;j++){ scanf("%d",&a[j]); tmp+=a[j]*bit[j]; } num[tmp]++; } src=0,des=1024+m+1; int nodenum=1024+m+2; for(int i=0;i<1024;i++){ if(num[i]==0) continue; addedge(src,i+1,num[i]); for(int j=0;j<10;j++) if(i&bit[j]) addedge(i+1,1024+j+1,INF); } int tmp; for(int i=1;i<=m;i++){ scanf("%d",&tmp); addedge(i+1024,des,tmp); } if(SAP(nodenum)==n) printf("YES\n"); else printf("NO\n"); } return 0; }
2,Hungary
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=100010; const int M=12; int map[N][M],cap[M],num[M]; //i适合在j上生存 , 星球的容量,,星球上人数 int linker[N][M],vis[M]; int n,m,flag; int in() { char ch; int a = 0; while((ch = getchar()) == ' ' || ch == '\n'); a += ch - '0'; while((ch = getchar()) != ' ' && ch != '\n') { a *= 10; a += ch - '0'; } return a; } int DFS(int u){ int v; for(v=0;v<m;v++) //枚举每个星球 if(!vis[v] && map[u][v]){ vis[v]=1; if(num[v]<cap[v]){ //i星球上人数小于容量 linker[num[v]++][v]=u; return 1; } for(int j=0;j<num[v];j++) if(DFS(linker[j][v])){ //给link[i][j]找新的星球 linker[j][v]=u; return 1; } } return 0; } void Hungary(){ //memset(linker,-1,sizeof(linker)); for(int u=0;u<n;u++){ memset(vis,0,sizeof(vis)); if(!DFS(u)){ flag=0; break; } } } int main(){ //freopen("input.txt","r",stdin); while(~scanf("%d%d",&n,&m)){ for(int i=0;i<n;i++) for(int j=0;j<m;j++) map[i][j]=in(); //此题用scanf则TLE,,哎,只能自己写输入函数了 for(int i=0;i<m;i++) scanf("%d",&cap[i]); memset(num,0,sizeof(num)); flag=1; Hungary(); if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }
相关推荐
压缩包内的文件名“朝花夕拾——hdu”可能表示这是一系列关于HDU题目的代码记录,"朝花夕拾"是一个成语,意味着回忆过去的事情,这里可能是暗示这些代码是作者在过去解决HDU题目时留下的,现在整理出来分享或复习。...
"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届活动。这个压缩包可能是参赛者或教练分享的解题代码和资料。 【描述】提到的"水仙花数"问题,是计算机科学和算法竞赛中...
【标题】"HDU题目java实现"所涉及的知识点主要集中在使用Java编程语言解决杭州电子科技大学(HDU)在线评测系统中的算法问题。HDU是一个知名的在线编程竞赛平台,它提供了大量的算法题目供参赛者练习和提交解决方案...
ACM HDU 题目分类 ACM HDU 题目分类是指对 HDU 在线判题系统中题目的分类,总结了大约十来个分类。这些分类将有助于编程选手更好地理解和解决问题。 DP 问题 DP(Dynamic Programming,动态规划)是一种非常重要...
【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...
### hdu1250高精度加法 #### 背景介绍 在计算机科学与编程竞赛中,处理大整数运算(特别是加法、减法、乘法等)是常见的需求之一。当数字的位数超过了标准数据类型(如`int`、`long`等)所能表示的最大值时,就需要...
【标题】"HDU DP动态规划"涉及到的是在算法领域中的动态规划(Dynamic Programming,简称DP)技术,这是解决复杂问题的一种高效方法,尤其适用于有重叠子问题和最优子结构的问题。动态规划通常用于优化多阶段决策...
数学在ACM竞赛中扮演着重要角色,包括数论(模运算、同余方程、欧几里得算法等)、组合数学(排列组合、容斥原理、鸽巢原理等)、图论(网络流、最大匹配等)。理解并运用这些数学知识,可以解决很多看似复杂的问题...
HDU1059的代码
hdu1001解题报告
hdu 1574 passed sorce
这类问题通常需要参赛者利用计算机编程解决数学、逻辑或算法上的挑战,以求在限定时间内提交正确的解决方案。这类竞赛有助于提升编程能力、算法思维以及问题解决技巧。 【标签】:“杭电”代表题目来源于杭州电子...
动态规划的关键在于确定状态转移方程,即如何从前一个或前几个状态转移到当前状态。 ### 知识点详解 #### Robberies (抢劫) 题目链接:[Robberies](http://acm.hdu.edu.cn/showproblem.php?pid=2955) - **问题...
在压缩包文件名列表中提到的"acm",很可能是一个文件夹或文件,它包含了ACM HDU题目解题的相关资料,例如: 1. **题目描述文档**:这些文件可能包含每个题目的详细说明,包括输入输出示例、测试数据和解题要求。 2....
hdu2101AC代码
hdu 5007 Post Robot 字符串枚举。 暴力一下就可以了。
标签"HDu acm"进一步确认了这些代码与ACM竞赛相关的编程挑战有关,可能是参赛者或训练者为了准备比赛而编写的。在ACM竞赛中,团队需要在有限的时间内解决多个复杂的问题,因此高效的编码和算法实现至关重要。 虽然...
hdu 1166线段树代码
暗示这是一个与HDU(杭州电子科技大学在线编程平台)相关的压缩包,其中可能包含了该平台上的编程竞赛题目或练习题目的源代码。"hdu07"可能是某个特定题目的编号,而"com_shownv9b"和"www.563hdu."可能是网站的子...
HDU(Hangzhou Dianzi University)是国内外知名的在线编程竞赛平台,主要服务于ACM/ICPC(国际大学生程序设计竞赛)以及相关的算法训练。"HDU最全ac代码"这个压缩包很可能是包含了在HDU平台上解题通过的完整源代码...