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?
——>>方法如: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 ...
随机推荐
- Jenkins: 使用Jenkins搭建持续集成(CI)环境
http://www.cnitblog.com/luckydmz/archive/2012/01/03/77007.html 首先从官网http://jenkins-ci.org/下载 Java We ...
- XPSP2 PSDK(还有lostspeed)
XPSP2 PSDK Full Download with Local Install Use the full download to copy the entire Windows XP SP2 ...
- Next-Key Locks
Next-Key Locks 一个next-key lock 是 一个record lock 在index record 和 一个区间锁 在一个区间在index record之前 InnoDB 执行 ...
- C# Http以文件的形式上传文件
以下的是上传的方法: // <summary> /// 将本地文件上传到指定的服务器(HttpWebRequest方法) /// </summary> /// <para ...
- 硬盘重装Ubuntu12.04的感受
好久没更blog了,最近这两天系统也出了问题,win7蓝屏,ubuntu进不去-.后来win7整好了,ubuntu依旧顽固.用惯了linux,就不想在转到win7下面了,估计是习惯了各种敲命令的感觉吧 ...
- WM_PARENTNOTIFY的作用(不完全)
VCL里源码如下: procedure TWinControl.WMParentNotify(var Message: TWMParentNotify); begin with Message do ...
- poj 2411 Mondriaan's Dream dp
一个比较简单的状压dp,记录下每个点的状态即可. #include <iostream> #include <cstdio> #include <cstring> ...
- XML实例文档
from: http://www.w3school.com.cn/xpath/xpath_examples.asp XML实例文档 我们将在下面的例子中使用这个 XML 文档: "books ...
- 世界gis相关的资源网站分类整理
********************首先介绍个新颖的GIS论坛——GIS520论坛******************** GIS520论坛(共享地信学习资源的专业论坛) www.gis520.c ...
- ffplay2 android 版正式公布
项目地址:https://github.com/DeYangLiu/AndroidPlayer/ 下载链接: 看点: 支持软键盘输入和历史记录.使用了EditText和内部存储. 这里考虑了历史记录的 ...