hdu - 4975 - A simple Gaussian elimination problem.(最大流量)
意甲冠军:要在N好M行和列以及列的数字矩阵和,每个元件的尺寸不超过9,询问是否有这样的矩阵,是独一无二的N(1 ≤ N ≤ 500) , M(1 ≤ M ≤ 500)。
主题链接:http://acm.hdu.edu.cn/showproblem.php?
pid=4975
——>>方法如:http://blog.csdn.net/scnu_jiechao/article/details/40658221
先做hdu - 4888,再来做此题的时候,感觉这题好 SB 呀。将代码提交后自己就 SB 了。咋 TLE 了??
此题卡时间比較严。。能够在判环的地方优化一下4888的代码。由于原选建好的图中的行到列的边,在判环的时候,每条边会被判 (N - 1) * (M - 1) + 1 次,假设先对残量网络又一次建图,那么就仅仅会在建图的时候被判一次。差距甚远。
注:输入开挂会RE。猜想输入数据中有负数。。
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm> using std::min;
using std::queue; const int MAXN = 500 * 2 + 10;
const int MAXM = 500 * 500 + 2 * MAXN;
const int INF = 0x3f3f3f3f; struct EDGE
{
int from;
int to;
int cap;
int flow;
int nxt;
} edge[MAXM << 1]; int N, M, kase;
int sum;
int S, T;
int hed[MAXN], ecnt;
int cur[MAXN], h[MAXN];
bool impossible, bUnique; void Init()
{
impossible = false;
bUnique = true;
ecnt = 0;
memset(hed, -1, sizeof(hed));
} void AddEdge(int u, int v, int cap)
{
edge[ecnt].from = u;
edge[ecnt].to = v;
edge[ecnt].cap = cap;
edge[ecnt].flow = 0;
edge[ecnt].nxt = hed[u];
hed[u] = ecnt++;
edge[ecnt].from = v;
edge[ecnt].to = u;
edge[ecnt].cap = 0;
edge[ecnt].flow = 0;
edge[ecnt].nxt = hed[v];
hed[v] = ecnt++;
} bool Bfs()
{
memset(h, -1, sizeof(h));
queue<int> qu;
qu.push(S);
h[S] = 0;
while (!qu.empty())
{
int u = qu.front();
qu.pop();
for (int e = hed[u]; e != -1; e = edge[e].nxt)
{
int v = edge[e].to;
if (h[v] == -1 && edge[e].cap > edge[e].flow)
{
h[v] = h[u] + 1;
qu.push(v);
}
}
} return h[T] != -1;
} int Dfs(int u, int cap)
{
if (u == T || cap == 0) return cap; int flow = 0, subFlow;
for (int e = cur[u]; e != -1; e = edge[e].nxt)
{
cur[u] = e;
int v = edge[e].to;
if (h[v] == h[u] + 1 && (subFlow = Dfs(v, min(cap, edge[e].cap - edge[e].flow))) > 0)
{
flow += subFlow;
edge[e].flow += subFlow;
edge[e ^ 1].flow -= subFlow;
cap -= subFlow;
if (cap == 0) break;
}
} return flow;
} int Dinic()
{
int maxFlow = 0; while (Bfs())
{
memcpy(cur, hed, sizeof(hed));
maxFlow += Dfs(S, INF);
} return maxFlow;
} int ReadInt()
{
int ret = 0;
char ch; while ((ch = getchar()) && ch >= '0' && ch <= '9')
{
ret = ret * 10 + ch - '0';
} return ret;
} void Read()
{
int r, c;
int rsum = 0, csum = 0; scanf("%d%d", &N, &M);
S = 0;
T = N + M + 1;
getchar();
for (int i = 1; i <= N; ++i)
{
// r = ReadInt();
scanf("%d", &r);
rsum += r;
AddEdge(S, i, r);
}
for (int i = 1; i <= M; ++i)
{
// c = ReadInt();
scanf("%d", &c);
csum += c;
AddEdge(i + N, T, c);
} if (rsum != csum)
{
impossible = true;
return;
} sum = rsum;
for (int i = 1; i <= N; ++i)
{
for (int j = M; j >= 1; --j)
{
AddEdge(i, j + N, 9);
}
}
} void CheckPossible()
{
if (impossible) return;
if (Dinic() != sum)
{
impossible = true;
}
} void AddEdge(int u, int v)
{
edge[ecnt].to = v;
edge[ecnt].nxt = hed[u];
hed[u] = ecnt++;
} void ReBuild()
{
memset(hed, -1, sizeof(hed));
int total = ecnt;
ecnt = 0;
for (int e = 0; e < total; ++e)
{
if (edge[e].cap > edge[e].flow)
{
AddEdge(edge[e].from, edge[e].to);
}
}
} bool vis[MAXN];
bool CheckCircle(int x, int f)
{
vis[x] = true;
for (int e = hed[x]; e != -1; e = edge[e].nxt)
{
int v = edge[e].to;
if (v != f)
{
if (vis[v]) return true;
if (CheckCircle(v, x)) return true;
}
}
vis[x] = false;
return false;
} void CheckUnique()
{
if (impossible) return;
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= N; ++i)
{
if (CheckCircle(i, -1))
{
bUnique = false;
return;
}
}
} void Output()
{
printf("Case #%d: ", ++kase);
if (impossible)
{
puts("So naive!");
}
else if (bUnique)
{
puts("So simple!");
}
else
{
puts("So young!");
}
} int main()
{
int T; scanf("%d", &T);
while (T--)
{
Init();
Read();
CheckPossible();
ReBuild();
CheckUnique();
Output();
} return 0;
}
hdu - 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 最大流+找环
原题链接 http://acm.hdu.edu.cn/showproblem.php?pid=4975 这是一道很裸的最大流,将每个点(i,j)看作是从Ri向Cj的一条容量为9的边,从源点除法连接每个 ...
- HDOJ 4975 A simple Gaussian elimination problem.
和HDOJ4888是一样的问题,最大流推断多解 1.把ISAP卡的根本出不来结果,仅仅能把全为0或者全为满流的给特判掉...... 2.在残量网络中找大于2的圈要用一种类似tarjian的方法从汇点開 ...
- 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/ ...
- hdu 4972 A simple dynamic programming problem(高效)
pid=4972" target="_blank" style="">题目链接:hdu 4972 A simple dynamic progra ...
随机推荐
- 分享一些免费的,开源的邮件server软件
因为企业的须要,我们非常可能须要架设一个邮件server,微软的Exchange太复杂?GOOGLE出来的又收费!头大了吧,OK,贾芸斐在这里给大家分享推荐几个免费的开源的邮件server软件.希望你 ...
- COCOS2D-X之帧动画的一种实现Demo
这个Demo主要是实现帧动画,建议游戏中少用帧动画.废话少说直接上代码. 一.我们直接在COCOS2D-X自带的HelloCpp的工程中添加代码即可.我们在初始化中添加如下代码并附上图片资源. CCS ...
- 虚继承之单继承的内存布局(VC在编译时会把vfptr放到类的头部,这和Delphi完全一致)
C++2.0以后全面支持虚函数与虚继承,这两个特性的引入为C++增强了不少功能,也引入了不少烦恼.虚函数与虚继承有哪些特性,今天就不记录了,如果能搞了解一下编译器是如何实现虚函数和虚继承,它们在类的内 ...
- [Android学习笔记]Android中多线程开发的一些概念
线程安全: 在多线程的情况下,不会因为线程之间的操作而导致数据错误. 线程同步: 同一个资源,可能在同一时间被多个线程操作,这样会导致数据错误.这是一个现象,也是一个问题,而研究如何解决此类问题的相关 ...
- 同一个页面里的JS怎样获取jsp从别的页面获取的参数
<html><from name="from1"><input=hidden name="myhidden" value=< ...
- 推动Common Lisp的实际应用
推动Common Lisp的实际应用 推动Common Lisp的实际应用
- Android资源管理框架(Asset Manager)简介和学习计划
Android该应用程序包括两个部分组成的:代码和资源. 资源主要是与UI相关的东西,例如UI布局.和其他字符串和照片.代码和资源可以使独立的应用程序来组织的实际需求的基础上,在执行的时候UI.,就能 ...
- Mybatis 3 返回布尔值,需要注意的地方
在Mybatis中,有时候需要返回布尔值 ,来确定某个记录行是否存在. 例如: <select id="isExistCode" parameterType="st ...
- Oracle varchar2最大支持长度(转)
oerr ora 0650206502, 00000, "PL/SQL: numeric or value error%s"// *Cause: An arithmetic, nu ...
- UML简单介绍
UML的全称是统一建模语言:Unified Modeling Language. 是用来为面向对象开发系统的产品进行说明可视化和编制文档的方法. 它是一种标准的图形化建模语言,是面向对象分析与设计的一 ...