hdoj 3605 Escape
2015-07-25 16:22
288 查看
数据更新了之后网络流就会超时
首先第一步优化,状态压缩,因为有100000个人,而星球只有10个,所以每个人想去的星球的状态最多1<<10,大约1000过点,所以先统计状态,然后在压缩之后建图是个很大的优化,这个题目也是对网络流数据卡的很严,要用dinci或者sap,而且要假如优化。
首先第一步优化,状态压缩,因为有100000个人,而星球只有10个,所以每个人想去的星球的状态最多1<<10,大约1000过点,所以先统计状态,然后在压缩之后建图是个很大的优化,这个题目也是对网络流数据卡的很严,要用dinci或者sap,而且要假如优化。
[code]#include <map> #include <set> #include <stack> #include <queue> #include <cmath> #include <ctime> #include <vector> #include <cstdio> #include <cctype> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; #define INF 0x3f3f3f3f #define inf -0x3f3f3f3f #define lson k<<1, L, mid #define rson k<<1|1, mid+1, R #define mem0(a) memset(a,0,sizeof(a)) #define mem1(a) memset(a,-1,sizeof(a)) #define mem(a, b) memset(a, b, sizeof(a)) typedef long long ll; const int maxn=101000; struct Edge{ int from,to,cap,flow; Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f){} }; struct Dinic{ int n,m,s,t; //结点数,边数(包括反相弧),源点编号和汇点编号 vector<Edge>edges; //边表,edges[e]和edges[e^1]互为反相弧 vector<int>G[maxn]; //邻接表,G[i][j]表示结点i的第j条边在e数组中的序号 bool vis[maxn]; //BFS使用 int d[maxn]; //从起点到i的距离 int cur[maxn]; //当前弧下标 void AddEdge(int from,int to,int cap){ edges.push_back(Edge(from,to,cap,0)); edges.push_back(Edge(to,from,0,0)); m=edges.size(); G[from].push_back(m-2); G[to].push_back(m-1); } void init(int n){ this->n=n; for(int i=0;i<=n;i++) G[i].clear(); edges.clear(); } bool BFS(){ mem0(vis); queue<int>Q; Q.push(s); d[s]=0; vis[s]=1; while(!Q.empty()){ int x=Q.front(); Q.pop(); for(int i=0;i<G[x].size();i++){ //只考虑残量网络中的弧 Edge& e=edges[G[x][i]]; if(!vis[e.to]&&e.cap>e.flow){ vis[e.to]=1; d[e.to]=d[x]+1; Q.push(e.to); } } } return vis[t]; } ll DFS(int x,int a){ if(x==t||a==0) return a; ll flow=0,f; for(int& i=cur[x];i<G[x].size();i++){ Edge& e=edges[G[x][i]]; if(d[x]+1==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>0){ e.flow+=f; edges[G[x][i]^1].flow-=f; flow+=f; a-=f; if(a==0) break; } } return flow; } ll Maxflow(int s,int t){ this->s=s; this->t=t; ll flow=0; while(BFS()){ mem0(cur); flow+=DFS(s,INF); } return flow; } }; Dinic solve; int f[maxn]; int main(){ int n,m; while(scanf("%d%d",&n,&m)==2){ int x; mem0(f); int t=m+(1<<m)+3,nn=(1<<m)+2; solve.init(t+1); for(int i=0;i<n;i++){ int tmp=0; for(int j=0;j<m;j++){ scanf("%d",&x); if(x) tmp+=(1<<j); } f[tmp]++; } for(int i=0;i<(1<<m);i++){ if(f[i]){ solve.AddEdge(0,i+1,f[i]); for(int j=0;j<m;j++){ if(i&(1<<j)) solve.AddEdge(i+1,nn+j,f[i]); } } } for(int i=0;i<m;i++){ scanf("%d",&x); solve.AddEdge(nn+i,t,x); } int tmp=solve.Maxflow(0,t); if(tmp>=n){ printf("YES\n"); } else printf("NO\n"); } return 0; }
相关文章推荐
- VMware虚拟机无法识别U盘解决方案
- [Angularjs]ng-class,ng-class-even,ng-class-odd
- Augreener自发电遥控开关再掀无源无线技术风暴
- readTextFile.py
- 士兵队列训练报数问题
- 监听EditText的输入
- poj 3548 Restoring the digits(DFS)
- [DM814x笔记]DDR相关配置
- 《机器学习系统设计》(2)
- HDU1276:士兵队列训练
- Android—开发自学历程(1)-Activity(4)-UI布局
- poj 3548 Restoring the digits(DFS)
- 《机器学习系统设计》(2)
- 打印输出100以内的素数
- 《深入浅出struts2》--第六章,通用标签(以及第五章节标签)疑问
- [leetcode ]220.Contains Duplicate III
- Code Forces 538 C. Tourist's Notes(贪心)
- 二叉树的创建和遍历
- android仿ios时间控件
- 噩梦射手5 角色血量 死亡 重新加载