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 ...
随机推荐
- jsp获得本地及serverIP的方法
InetAddress addr = InetAddress.getLocalHost(); String ip = addr.getHostAddress().toString();//获得本机IP ...
- 移植一个开源点餐网到SAE平台上
记得以前我准备弄个点餐网的,但是由于一些原因没有做下去. 前几天将网上的一个点餐源码移植到了SAE上,网址http://diancan4sae.sinaapp.com. 我想做个外卖网,先选一个学校周 ...
- 用Swift开发二维码扫描器教程
(原文:Building a QR Code Reader in Swift 作者:Simon Ng 译者:xiaoying )我相信大多数人都知道二维码(QR code)是什么,如果你对这个概念还不 ...
- Label的各个属性
- arch Failed to load module "intel"
arch启动x的时候出现问题困扰我一天了,终于解决掉了. 错误如下: [ 61.086] (II) LoadModule: "intel" [ 61.087] (WW) Warni ...
- [置顶] 初识window.location.search
window.location.search是从当前URL的?号开始的字符串 如:http://www.domain.com/item?id=0064014 它的search就是?id=0064014
- Delphi XE中类成员的访问权限(新增了strict private和strict protected,还有automated)
Delphi XE中类成员的访问权限共提供了6个关键词来用于限定访问权限:public.private.protected.published.automated strict private . s ...
- 奋斗的孩子的TableView(三篇文章)
http://blog.sina.com.cn/s/blog_a6fb6cc90101i8it.html http://blog.sina.com.cn/s/blog_a6fb6cc90101hhse ...
- 玩转Windows服务系列——Debug、Release版本的注册和卸载,及其原理
原文:玩转Windows服务系列——Debug.Release版本的注册和卸载,及其原理 Windows服务Debug版本 注册 Services.exe -regserver 卸载 Services ...
- Java Thread.join()详解(转)
(1)join方法是可以中断的(2)在线程joiner在另一个线程t上调用t.join(),线程joiner将被挂起,直到线程t结束(即t.isAlive()返回为false)才恢复 package ...