hdu4975 A simple Gaussian elimination problem.(最大流+判环)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4975
题意:和hdu4888基本一样( http://www.cnblogs.com/a-clown/p/6670043.html ),但是这题的时间限制是1000ms 比较卡时间需要优化。
思路:看学长的代码,用引用优化,加一个&i 这样i的本质就是用来改变head[i]的值,本来head[u]记录的是原图的所有信息,
但现在head[u]一直在靠近最后的点,相当于遍历过一次就不会再继续遍历到这个点了。相当于做了优化,dfs过的点直接剪枝了。
AC代码:
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<queue>
- using namespace std;
- const int MAXN=;
- const int MAXM=**;
- const int INF=0x3f3f3f3f;
- struct Edge
- {
- int to,next,cap,flow;
- } edge[MAXM];
- int tol;
- int head[MAXN];
- int gap[MAXN],dep[MAXN],pre[MAXN],cur[MAXN];
- void init()
- {
- tol=;
- memset(head,-,sizeof(head));
- }
- void Addedge(int u,int v,int w,int rw=)
- {
- edge[tol].to = v;
- edge[tol].cap = w;
- edge[tol].next = head[u];
- edge[tol].flow = ;
- head[u] = tol++;
- edge[tol].to = u;
- edge[tol].cap = rw;
- edge[tol].next = head[v];
- edge[tol].flow = ;
- head[v]=tol++;
- }
- int sap(int start,int end,int N)
- {
- memset(gap,,sizeof(gap));
- memset(dep,,sizeof(dep));
- memcpy(cur,head,sizeof(head));
- int u=start;
- pre[u]=-;
- gap[]=N;
- int ans=;
- while(dep[start]<N)
- {
- if(u==end)
- {
- int Min=INF;
- for(int i=pre[u]; i!=-; i=pre[edge[i^].to])
- if(Min>edge[i].cap-edge[i].flow)
- Min=edge[i].cap-edge[i].flow;
- for(int i=pre[u]; i!=-; i=pre[edge[i^].to])
- {
- edge[i].flow+=Min;
- edge[i^].flow-=Min;
- }
- u=start;
- ans+=Min;
- continue;
- }
- bool flag=false;
- int v;
- for(int i=cur[u]; i!=-; i=edge[i].next)
- {
- v=edge[i].to;
- if(edge[i].cap-edge[i].flow && dep[v]+==dep[u])
- {
- flag=true;
- cur[u]=pre[v]=i;
- break;
- }
- }
- if(flag)
- {
- u=v;
- continue;
- }
- int Min=N;
- for(int i=head[u]; i!=-; i=edge[i].next)
- if(edge[i].cap-edge[i].flow && dep[edge[i].to]<Min)
- {
- Min=dep[edge[i].to];
- cur[u]=i;
- }
- gap[dep[u]]--;
- if(!gap[dep[u]])return ans;
- dep[u]=Min+;
- gap[dep[u]]++;
- if(u!=start) u=edge[pre[u]^].to;
- }
- return ans;
- }
- bool vit[MAXN],sing[MAXN];
- int n,m;
- int dfs(int u,int p)
- {
- if(vit[u])return ;
- vit[u]=;
- for(int &i=head[u]; i!=-; i=edge[i].next)
- {
- int v=edge[i].to;
- if(v!=p && edge[i].cap-edge[i].flow>)
- if(dfs(v,u)) return ;
- }
- vit[u]=;
- return ;
- }
- int main()
- {
- int T;
- scanf("%d",&T);
- for(int t=; t<=T; t++)
- {
- init();
- scanf("%d%d",&n,&m);
- int sum1=,sum2=;
- int x;
- for(int i=; i<=n; i++)
- {
- scanf("%d",&x);
- sum1+=x;
- Addedge(,i,x);
- }
- for(int i=; i<=m; i++)
- {
- scanf("%d",&x);
- sum2+=x;
- Addedge(i+n,n+m+,x);
- }
- if(sum1!=sum2)
- {
- printf("Case #%d: So naive!\n",t);
- continue;
- }
- for(int i=; i<=n; i++)
- for(int j=; j<=m; j++)
- Addedge(i,j+n,);
- int ans=sap(,n+m+,n+m+);
- if(ans==sum1 && ans==sum2)
- {
- int flag=;
- memset(vit,,sizeof(vit));
- for(int i=; i<=n; i++)
- {
- memset(vit,,sizeof(vit));
- if(dfs(i,-))
- {
- flag=;
- break;
- }
- }
- if(flag) printf("Case #%d: So young!\n",t);
- else printf("Case #%d: So simple!\n",t);
- }
- else printf("Case #%d: So naive!\n",t);
- }
- return ;
- }
hdu4975 A simple Gaussian elimination problem.(最大流+判环)的更多相关文章
- hdu 4975 A simple Gaussian elimination problem 最大流+找环
原题链接 http://acm.hdu.edu.cn/showproblem.php?pid=4975 这是一道很裸的最大流,将每个点(i,j)看作是从Ri向Cj的一条容量为9的边,从源点除法连接每个 ...
- hdu4975 A simple Gaussian elimination problem.(正确解法 最大流+删边判环)(Updated 2014-10-16)
这题标程是错的,网上很多题解也是错的. http://acm.hdu.edu.cn/showproblem.php?pid=4975 2014 Multi-University Training Co ...
- A simple Gaussian elimination problem.(hdu4975)网络流+最大流
A simple Gaussian elimination problem. Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65 ...
- HDOJ 4975 A simple Gaussian elimination problem.
和HDOJ4888是一样的问题,最大流推断多解 1.把ISAP卡的根本出不来结果,仅仅能把全为0或者全为满流的给特判掉...... 2.在残量网络中找大于2的圈要用一种类似tarjian的方法从汇点開 ...
- HDU 4975 A simple Gaussian elimination problem.
A simple Gaussian elimination problem. Time Limit: 1000ms Memory Limit: 65536KB This problem will be ...
- hdu - 4975 - A simple Gaussian elimination problem.(最大流量)
意甲冠军:要在N好M行和列以及列的数字矩阵和,每个元件的尺寸不超过9,询问是否有这样的矩阵,是独一无二的N(1 ≤ N ≤ 500) , M(1 ≤ M ≤ 500). 主题链接:http://acm ...
- hdu 4975 A simple Gaussian elimination problem.(网络流,推断矩阵是否存在)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4975 Problem Description Dragon is studying math. One ...
- A simple Gaussian elimination problem.
hdu4975:http://acm.hdu.edu.cn/showproblem.php?pid=4975 题意:给你一个n*m的矩阵,矩阵中的元素都是0--9,现在给你这个矩阵的每一行和每一列的和 ...
- hdu4888 Redraw Beautiful Drawings 最大流+判环
hdu4888 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/6553 ...
随机推荐
- 搭建nexus私服,无法下载相关jar包,报错Repository proxy-mode is BLOCKED_AUTO
在搭建nexus私服的时候,之前没直接用来下载maven的相关插件jar包,一直可以使用, 结果今天要编译hadoop的时候,在linux上新用maven就报错了,无法下载maven的相关插件(如下) ...
- 2017CodeM初赛A场
A.最长树链(loj6159) 分析: 对于每个质因数,取出所有是它倍数的点组成一个树,然后找最长路径 每个数操作次数是其质因数的个数 所以总的复杂度不超过O(nlogA) B.二分图染色(loj61 ...
- loj6157 A^B Problem (并查集)
题目: https://loj.ac/problem/6157 分析: 这种树上异或,一般是采用分位考虑,但是这题即使分位,也会发现非常不好处理 这里考虑维护一个点到其根的路径的异或值 用并查集去检测 ...
- 石家庄地铁查询PSP0级
一.需求 :地铁(石家庄地铁)线路查询 二. 学生:洪鼎淇 合作对象:宋子健 时间记录日志: 日期 开始时间 结束时间 中断时间 净时间 活动 2019/3/30 10:00 14:0 ...
- 【.Net 学习系列】-- EF Core实践(Code First)
一.开发环境: vs2015, .Net Framework 4.6.1 二.解决方案: 新建一个控制台应用程序 添加引用:Microsoft.EntityFrameworkCore.SqlServe ...
- HUNT:一款可提升漏洞扫描能力的BurpSuite漏洞扫描插件
今天给大家介绍的是一款BurpSuite插件,这款插件名叫HUNT.它不仅可以识别指定漏洞类型的常见攻击参数,而且还可以在BurpSuite中组织测试方法. HUNT Scanner(hunt_sca ...
- Centos5设置静态IP地址
1.设置静态IP地址,修改/etc/sysconfig/network-scripts/ifcfg-eth0的内容: DEVICE=eth0 #网卡对应的设备别名 BOOTPROTO=static # ...
- ASP.net MVC+ViewData VS ViewBag
在使用MVC框架的过程中,往界面传值,我们使用的ViewData.如ITOO部分代码图解: 当然除了ViewData,我们还能够使用同卵兄弟(ViewBag)来完毕相同的功能,详情 ...
- Lucene中TokenStream,Tokenizer,TokenFilter,TokenStreamComponents与Analyzer
TokenStream extends AttributeSource implements Closeable: incrementToken,end,reset,close Tokenizer直接 ...
- asp.net mvc的权限管理设计
现在集中展示用户-角色-权限管理的功能,因此,所有数据表一律简化处理. 1 后台管理效果 (1)角色管理 (2)权限管理 2 数据库设计(MSSQL) (1)用户表dbo.Users 项 类型 ...