UVa1440/LA4597 Inspection

2024-09-03 06:36
文章标签 inspection uva1440 la4597

本文主要是介绍UVa1440/LA4597 Inspection,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

UVa1440/LA4597 Inspection

  • 题目链接
  • 题意
  • 分析
  • AC 代码

题目链接

  本题是2009年icpc欧洲区域赛东北欧赛区的I题

题意

  你带领一支团队检查一所新建的滑雪场地。滑雪场地可以用一个有向无环图表示,其中图的结点代表滑坡之间的交叉点,边代表滑坡,方向总是从高到低(否则就没有办法借助重力滑雪了)。
  你的团队必须检查每一个滑坡。由于电梯还没有正式启用,你必须用直升机完成任务。每次使用直升机可以在滑雪场地的某个交叉点放置一人,让他顺着滑坡往下滑,沿途检查他所滑过的所有滑坡。每个滑坡可以被检查多次,但必须至少被检查一次。你现在要计算至少用几次直升机才能完成所有滑坡的检查工作。

分析

  每个滑坡至少被检查一次,因此本题是容量有下界的网络流求最小流,按照上下界网络流中的有源有汇有容量上下界网络的最小流求解即可。
  本题首先要添加源点s和汇点t并结合原始边信息建图,然后汇点向源点连无限边形成无源无汇的上下界网络,最后还要附加源S和汇T将其转化成有源有汇有容量上下界网络的最小流。求出最小流后得到了第一个答案,但是还要输出方案,遍历s的出边 ( s , u i ) (s,u_i) (s,ui),若其流量 f i f_i fi非0,则从 u i u_i ui出发有 f i f_i fi条检查路径:沿着流量 f ≥ 0 f\ge0 f0(因为要加上下界1, f ≥ 0 f\ge0 f0意味着边上有流量)的路径走到t就可以输出一条路径(不需要输出t,并且路径上的每条边流量要减1),每找完一条路径将 f i f_i fi也减1。

AC 代码

#include <iostream>
#include <cstring>
using namespace std;#define M 10800
#define N 104
struct edge {int u, v, cap, flow;} e[M];
int g[N][N], q[N], p[N], d[N], cur[N], num[N+1], cnt[N], cs[N], ct[N], c, n; bool vis[N];void add_edge(int u, int v, int cap) {e[c] = {u, v, cap, 0}; g[u][cnt[u]++] = c++; e[c] = {v, u, 0, 0}; g[v][cnt[v]++] = c++;
}bool bfs(int s, int t) {memset(vis, 0, sizeof(vis)); q[0] = t; d[t] = 0; vis[t] = true;int head = 0, tail = 1;while (head < tail) {int v = q[head++];for (int i=0; i<cnt[v]; ++i) {const edge& ee = e[g[v][i]^1];if (!vis[ee.u] && ee.cap > ee.flow) vis[ee.u] = true, d[ee.u] = d[v] + 1, q[tail++] = ee.u;}}return vis[s];
}int max_flow(int s, int t, int n) {int flow = 0, u = s;for (int i=0; i<n; ++i) d[i] = n;if (!bfs(s, t)) return 0;memset(num, 0, sizeof(num)); memset(cur, 0, sizeof(cur));for (int i=0; i<n; ++i) ++num[d[i]];while (d[s] < n) {if (u == t) {int a = M;for (int v=t; v!=s; v = e[p[v]].u) a = min(a, e[p[v]].cap - e[p[v]].flow);for (int v=t; v!=s; v = e[p[v]].u) e[p[v]].flow += a, e[p[v]^1].flow -= a;flow += a; u = s;}bool ok = false;for (int i=cur[u]; i<cnt[u]; ++i) {const edge& ee = e[g[u][i]];if (ee.cap > ee.flow && d[u] == d[ee.v] + 1) {ok = true; p[ee.v] = g[u][i]; cur[u] = i; u = ee.v;break;}}if (!ok) {int m = n-1;for (int i=0; i<cnt[u]; ++i) {const edge& ee = e[g[u][i]];if (ee.cap > ee.flow) m = min(m, d[ee.v]);}if (--num[d[u]] == 0) break;++num[d[u] = m + 1]; cur[u] = 0;if (u != s) u = e[p[u]].u;}}return flow;
}void solve() {int s = 0, t = n+1, f = 0; memset(cnt, c = 0, sizeof(cnt)); memset(cs, 0, sizeof(cs)); memset(ct, 0, sizeof(ct));for (int u=1; u<=n; ++u) {int k, v; cin >> k;if (!k) continue;add_edge(s, u, M);while (k--) cin >> v, ++f, ++cs[v], ++ct[u], add_edge(u, v, M);}int x = c; add_edge(t, s, M); s = t+1; t = s+1;for (int i=0; i<s; ++i) {if (cs[i]) add_edge(i, s-1, M), add_edge(s, i, cs[i]);if (ct[i]) add_edge(i, t, ct[i]);}max_flow(s, t, t+1); f = e[x].flow; e[x].cap = e[x].flow = e[x^1].flow = 0;cout << f - max_flow(s-1, 0, t+1) << endl;for (int i=0; i<cnt[0]; ++i) {edge &ee = e[g[0][i]];if (ee.v > n || !ee.flow) continue;while (ee.flow) {t = 0; --ee.flow;for (int u = ee.v; u != s-1;) {p[t++] = u;for (int j=0; j<cnt[u]; ++j) if (~g[u][j]&1) {edge &eg = e[g[u][j]];if (eg.v > 0 && eg.v < s && eg.flow >= 0) {--eg.flow; u = eg.v; break;}}}for (int j=1; j<t; ++j) cout << p[j-1] << ' ';cout << p[t-1] << endl;}}
}int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);while (cin >> n) solve();return 0;
}

这篇关于UVa1440/LA4597 Inspection的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132295

相关文章

IDEA 编码规约扫描 Code inspection did not find anything to report.

IDEA安装了Alibaba Java Coding Guidelines插件,却看不到规约检查结果。手动进行编码规约扫描,弹窗提示“Code inspection did not find anything to report.”:  这种情况是因为代码文件所在的目录被标记成了测试文件(Test Sources Root绿色): 改成Sources Root(蓝色)就好了,就会出

《代码大全》:review与inspection

第21章Collaborative Construction(协同构建)谈到了review和inspection,读起来很有共鸣,让我回想去过去在公司兼职的一段美好时光。   在公司里,项目的代码是共有的,对我们这些兼职学生也不例外。每天上班第一件事,就是update一下,从depot取回最新的code base(我们管这叫sync,这是我们的版本控制软件的命令)。然后每次check i

AndroidStudio Analyze->run inspection by name (查找未使用资源和潜在空指针)

AS中lint的工具 Analyze可以对代码进行动态检测,功能十分强大,可以帮助我们发现代码的潜在bug(内存泄漏,空指针),未使用的资源和不规范的写法等等很多问题。平时用的最多的功能就是点击工具栏的Analyze-> inspect code ,其实还可以通过运行特定命令进行代码中某一项的检测,运行 run inspection by name,下面介绍一些常用的命令的名字。 常用的name命

【PyCharm警告】This inspection detects shadowing built-in names, such as ‘len‘ or ‘list‘.

在写代码时,出现了警告,然后我查了一下相关资料才知道原因。 今天将该学到的知识点记录下来 警告:This inspection detects shadowing built-in names, such as ‘len’ or ‘list’. list()是内置函数 警告的原因: 若使用内置函数的名字作为变量名,Python 解释器倒不会报错,只是该内置函数就被这个变量覆盖了,该内置函数就

python3 警告:This inspection detects shadowing built-in names, such as 'len' or 'list'.

在写代码时,出现了警告,然后我查了一下相关资料才知道原因。 今天将该学到的知识点记录下来 警告:This inspection detects shadowing built-in names, such as ‘len’ or ‘list’. list()是内置函数 警告的原因: 若使用内置函数的名字作为变量名,Python 解释器倒不会报错,只是该内置函数就被这个变量覆盖了,该内置函数就

爬虫:Spellchecker inspection helps locate typos and misspelling in your code

学爬虫,遇到报错:Spellchecker inspection helps locate typos and misspelling in your code,comments and literals, and fix them in one click. 大概是说,拼写检查发现了代码中的拼写错误。 百度了一下,原来是pycharm自带拼写检查的功能,可以选择关闭。打开设置,找到Editor

idea 解决author波浪线Spellchecker inspection helps locate typos and misspelling in your code, comments an

idea 解决author波浪线Spellchecker inspection helps locate typos and misspelling in your code, comments and literals, and fix them in one click 把默认的头注释的author改成自己的名字之后大概率会报波浪线; 然后当你把鼠标放上去,再点击提示上的“more”,

idea软件:spellchecker inspection helps locate typos and misspelled in your code,comments and literals问

刚开始用idea软件,对于刚使用软件的我发现一个问题,敲代码的时候,变量命名的时候经常出现波浪号(如下图),对于强迫症来说,这是无法接受的。 于是查询得到解决方法! 解决方法1:讲字符串添加进字典 解决方法2:禁用IDEA中的单词拼写检查 其实,我们从提示就可以看懂了:spellchecker inspection helps locate typos and miss

spellchecker inspection helps locate typos and misspelled in your code,comments and l

使用自己的名字当Tag。却发现有个非常不用好的提示。波浪,我浪个你妹。 Typo:In word ‘miyuehu’ less...(Ctrl+F1) spellchecker inspection helps locate typos and misspelled in your code,comments and literals, and fix them in one c

Pycharm 提示:Spellchecker inspection helps locate typos and misspelling in your code, comments and lit

如上图,输入一个单词时会出现波浪线,报:Spellchecker inspection helps locate typos and misspelling in your code, comments and literals, and fix them in one click. 翻译:拼写检查器检查可以帮助查找拼写错误和拼写错误在您的代码、注释和文本、 并修复它们中一次点击。 解决办