HDOJ 4975 A simple Gaussian elimination problem.
和HDOJ4888是一样的问题,最大流推断多解
1.把ISAP卡的根本出不来结果,仅仅能把全为0或者全为满流的给特判掉......
2.在残量网络中找大于2的圈要用一种类似tarjian的方法从汇点開始找,推断哪些点没有到汇点
A simple Gaussian elimination problem.
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1170 Accepted Submission(s): 377
the table after that.
However Dragon's mom came back and found what he had done. She would give dragon a feast if Dragon could reconstruct the table, otherwise keep Dragon hungry. Dragon is so young and so simple so that the original numbers in the table are one-digit number (e.g.
0-9).
Could you help Dragon to do that?
There are three lines for each block. The first line contains two integers N(<=500) and M(<=500), showing the number of rows and columns.
The second line contains N integer show the sum of each row.
The third line contains M integer show the sum of each column.
output one line contains only: "So young!", otherwise (only one way to reconstruct the table) you should output: "So simple!".
3 1 1 5 5 2 2 0 10 0 10 2 2 2 2 2 2
Case #1: So simple! Case #2: So naive! Case #3: So young!
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #pragma comment(linker, "/STACK:1024000000,1024000000")
- using namespace std;
- const int maxn=20000;
- const int maxm=500000;
- const int INF=0x3f3f3f3f;
- struct Edge
- {
- int to,next,cap,flow;
- }edge[maxm];
- int Size,Adj[maxn];
- int gap[maxn],dep[maxn],pre[maxn],cur[maxn];
- void init()
- {
- Size=0; memset(Adj,-1,sizeof(Adj));
- }
- void addedge(int u,int v,int w,int rw=0)
- {
- edge[Size].to=v; edge[Size].cap=w; edge[Size].next=Adj[u];
- edge[Size].flow=0; Adj[u]=Size++;
- edge[Size].to=u; edge[Size].cap=rw; edge[Size].next=Adj[v];
- edge[Size].flow=0; Adj[v]=Size++;
- }
- int sap(int start,int end,int N)
- {
- memset(gap,0,sizeof(gap));
- memset(dep,0,sizeof(dep));
- memcpy(cur,Adj,sizeof(Adj));
- int u=start;
- pre[u]=-1; gap[0]=N;
- int ans=0;
- while(dep[start]<N)
- {
- if(u==end)
- {
- int Min=INF;
- for(int i=pre[u];~i;i=pre[edge[i^1].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^1].to])
- {
- edge[i].flow+=Min;
- edge[i^1].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]+1==dep[u])
- {
- flag=true;
- cur[u]=pre[v]=i;
- break;
- }
- }
- if(flag)
- {
- u=v;
- continue;
- }
- int Min=N;
- for(int i=Adj[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+1;
- gap[dep[u]]++;
- if(u!=start) u=edge[pre[u]^1].to;
- }
- return ans;
- }
- int n,m;
- int a[maxn],b[maxn];
- bool vis[maxn],no[maxn];
- int Stack[maxm],stk;
- bool dfs(int u,int pre,bool flag)
- {
- vis[u]=true;
- Stack[stk++]=u;
- for(int i=Adj[u];~i;i=edge[i].next)
- {
- int v=edge[i].to;
- if(v==pre) continue;
- if(edge[i].flow>=edge[i].cap) continue;
- if(!vis[v])
- {
- if(dfs(v,u,edge[i^1].cap>edge[i^1].flow)) return true;
- }
- else if(!no[v]) return true;
- }
- if(flag==false)
- {
- while(true)
- {
- int v=Stack[--stk];
- no[v]=true;
- if(v==u) break;
- }
- }
- return false;
- }
- int main()
- {
- int T_T,cas=1;
- scanf("%d",&T_T);
- while(T_T--)
- {
- scanf("%d%d",&n,&m);
- int sum1=0,sum2=0;
- for(int i=1;i<=n;i++)
- {
- scanf("%d",a+i); sum1+=a[i];
- }
- for(int i=1;i<=m;i++)
- {
- scanf("%d",b+i); sum2+=b[i];
- }
- if(sum1!=sum2)
- {
- printf("Case #%d: So naive!\n",cas++);
- continue;
- }
- if(sum1==sum2&&((sum1==0)||(sum1==n*m*9)))
- {
- printf("Case #%d: So simple!\n",cas++);
- continue;
- }
- /*************build graph*****************/
- init();
- for(int i=1;i<=n;i++) addedge(0,i,a[i]);
- for(int i=1;i<=n;i++)
- for(int j=1;j<=m;j++)
- addedge(i,n+j,9);
- for(int i=1;i<=m;i++) addedge(i+n,n+m+1,b[i]);
- /*************build graph*****************/
- int MaxFlow=sap(0,n+m+1,n+m+2);
- if(MaxFlow!=sum1)
- {
- printf("Case #%d: So naive!\n",cas++);
- continue;
- }
- stk=0;
- memset(vis,0,sizeof(vis));
- memset(no,0,sizeof(no));
- if(dfs(n+m+1,n+m+1,0))
- {
- printf("Case #%d: So young!\n",cas++);
- }
- else
- {
- printf("Case #%d: So simple!\n",cas++);
- }
- }
- return 0;
- }
HDOJ 4975 A simple Gaussian elimination problem.的更多相关文章
- 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.(网络流,推断矩阵是否存在)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4975 Problem Description Dragon is studying math. One ...
- 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 这是一道很裸的最大流,将每个点(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 ...
- A simple Gaussian elimination problem.
hdu4975:http://acm.hdu.edu.cn/showproblem.php?pid=4975 题意:给你一个n*m的矩阵,矩阵中的元素都是0--9,现在给你这个矩阵的每一行和每一列的和 ...
- hdu4975 A simple Gaussian elimination problem.(最大流+判环)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4975 题意:和hdu4888基本一样( http://www.cnblogs.com/a-clown/ ...
- BNU 4356 ——A Simple But Difficult Problem——————【快速幂、模运算】
A Simple But Difficult Problem Time Limit: 5000ms Memory Limit: 65536KB 64-bit integer IO format: %l ...
随机推荐
- NHibernate3剖析:Query篇之NHibernate.Linq增强查询
系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种 ...
- php在数字前面补0得到固定长度数字的两种方法
比較基础,事实上两个内置函数都能实现. 1 sprintf 语法: string sprintf(string format, mixed [args]...); 返回值: 字符串 函数种类: 资料 ...
- Qt Quick 简单介绍
Qt Quick 是 Qt 提供的一种高级用户界面技术.使用它可轻松地为移动和嵌入式设备创建流畅的用户界面. 在 Android 设备上, Qt Quick 应用默认使用 OpenGL ES ,渲染效 ...
- Android学习路线(十三)Activity生命周期——暂停和恢复(Pausing and Resuming )一个Activity
在正常使用应用的过程中.前台的activity在一些时候会被其它的组件遮挡,导致这个activity暂停.举个样例.当一个半透明的activity被打开(比如一个dialog样式的activity), ...
- uva_644暴力加字典树解法
暴力 #include<iostream> #include<string.h> #include<cstdio> using namespace std; int ...
- JqGrid 查询时未设置初始页码导致的问题
本文所述问题发生在查询的数据有至少2页数据时的情况下.本例中的产品质量查询就是这样. 第一步:查询该时间段内的数据,结果为13页的数据内容,显示当前页第1页.如下图所示: 第二步:点击翻页按钮,打开第 ...
- exsi中的虚拟机添加磁盘后虚拟机中磁盘不出现
exsi中的虚拟机添加磁盘后虚拟机中磁盘不出现解决: 计算机---> 管理: 这里可以选择磁盘,格式,分区, 改盘符等操作
- 预测一下web前端未来的6个趋势
2018年前端技术的发展也将进入到一个相对稳定的阶段, 就前端主流技术框架的发展而言,过去的几年里发展极快,在填补原有技术框架空白和不足的同时也渐渐趋于成熟. 未来前端在已经趋向成熟的技术方向上面将会 ...
- Hadoop_HDFS-基础知识摘要
Hadoop典型应用有:搜索.日志处理.推荐系统.数据分析.视频图像分析.数据保存等.0.数据要首先分块 Block:将一个文件进行分块,通常是64M. NameNode:--管理节点保存整个文件系统 ...
- js Date() 时间函数处理 关于 toLocaleDateString()
toLocaleDateString()方法的真正含义为「根据本地时间把Date对象的日期部分转换为字符串」,这意味着:在不同的浏览器或者服务器中,我们可能得到不同的字符串. 例如,将 Chrome ...