【题意】n个点的一个无向图,在保证存在T条从1到n的不重复路径(任意一条边都不能重复)的前提下,要使得这t条路上经过的最长路径最短。 之所以把“经过的最长路径最短”划个重点是因为前面刚做了POJ2112那种求最长路径长度和最短的题,不要弄混了。在那道题中因为需要限制的是路径长度和,所以需要Floyd预处理路径,然后拆点变二分图防止间接流量边。然而这道题我们却不需要拆点了,直接建图即可。(类似最短路径和最小生成树的区别) 【建图】建一个源点连一条T流量的有向边到1节点;建一个汇点从n节点连一条T流量的有向边;其他边根据路径直接连一条无向边即可。 【无向边处理】在平常有向边的网络流加边时,我们都是加一条x流量的边再加一条0流量的反向边,那里反向边的作用的可以让程序自动修正流量路线。那么在加无向边时我们只要把反向边的流量也设为x即可,并且也不会失去修正的作用。 PS:有些人是像通常一样拆成两条相反边,并且还过了。但我觉得在网络流中这是不可行的,因为这样就改变了边流量的限制了。比如这道题中这样做,这条边明显不是只能走1次了吧。(2013.7.20:今天做了道拆点的题,发现如果是拆点的话这样也是可行的……>. #include #include #include #include #include #include #define MID(x,y) ((x+y)/2) #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; const int MAXV = 205; const int MAXE = 80005; const int oo = 0x3fffffff; struct node{ int u, v, flow; int opp; int next; }; struct Dinic{ node arc[MAXE]; int vn, en, head[MAXV]; //vn点个数(包括源点汇点),en边个数 int cur[MAXV]; //当前弧 int q[MAXV]; //bfs建层次图时的队列 int path[MAXE], top; //存dfs当前最短路径的栈 int dep[MAXV]; //各节点层次 void init(int n){ vn = n; en = 0; mem(head, -1); } void insert_flow(int u, int v, int flow){ arc[en].u = u; arc[en].v = v; arc[en].flow = flow; arc[en].opp = en + 1; arc[en].next = head[u]; head[u] = en ++; arc[en].u = v; arc[en].v = u; arc[en].flow = flow; //反向弧 arc[en].opp = en - 1; arc[en].next = head[v]; head[v] = en ++; } bool bfs(int s, int t){ mem(dep, -1); int lq = 0, rq = 1; dep[s] = 0; q[lq] = s; while(lq < rq){ int u = q[lq ++]; if (u == t){ return true; } for (int i = head[u]; i != -1; i = arc[i].next){ int v = arc[i].v; if (dep[v] == -1 && arc[i].flow > 0){ dep[v] = dep[u] + 1; q[rq ++] = v; } } } return false; } int solve(int s, int t){ int maxflow = 0; while(bfs(s, t)){ int i, j; for (i = 1; i <= vn; i ++) cur[i] = head[i]; for (i = s, top = 0;;){ if (i == t){ int mink; int minflow = 0x3fffffff; for (int k = 0; k < top; k ++) if (minflow > arc[path[k]].flow){ minflow = arc[path[k]].flow; mink = k; } for (int k = 0; k < top; k ++) arc[path[k]].flow -= minflow, arc[arc[path[k]].opp].flow += minflow; maxflow += minflow; top = mink; //arc[mink]这条边流量变为0, 则直接回溯到该边的起点即可(这条边将不再包含在增广路内). i = arc[path[top]].u; } for (j = cur[i]; j != -1; cur[i] = j = arc[j].next){ int v = arc[j].v; if (arc[j].flow && dep[v] == dep[i] + 1) break; } if (j != -1){ path[top ++] = j; i = arc[j].v; } else{ if (top == 0) break; dep[i] = -1; i = arc[path[-- top]].u; } } } return maxflow; } }dinic; struct Path{ int u, v, w; }p[MAXE]; int main(){ //freopen("test.in", "r", stdin); //freopen("test.out", "w", stdout); int n, path, t; scanf("%d %d %d", &n, &path, &t); for (int i = 0; i < path; i ++){ scanf("%d %d %d", &p[i].u, &p[i].v, &p[i].w); } int l = 0, r = 1000005; while(l < r){ int mid = MID(l, r); dinic.init(n+2); for (int i = 0; i < path; i ++){ if (p[i].w <= mid) dinic.insert_flow(p[i].u, p[i].v, 1); } dinic.insert_flow(n+1, 1, t); dinic.insert_flow(n, n+2, t); int res = dinic.solve(n+1, n+2); if (res == t){ r = mid; } else{ l = mid + 1; } } printf("%d\n", r); return 0; }  

转载于:https://www.cnblogs.com/AbandonZHANG/p/4114258.html

POJ 2455 Secret Milking Machine (二分+无向图最大流)相关推荐

  1. POJ 2455 Secret Milking Machine 二分枚举 + 最大流

    题目:http://poj.org/problem?id=2455 题意:给定一张无向图,有n个节点p条边,要求在图中从1到n找到t条路径,并且使这t条路径中的最长边最小,输出这个最小的最长边 思路: ...

  2. poj 2455 Secret Milking Machine(二分枚举+最大流)

    题意: 题意:FJ有N块地,这些地之间有P条双向路,每条路的都有固定的长度l.现在要你找出从第1块地到第n块地的T条不同路径,每条路径上的路不能与先前的路径重复,问这些路径中的最长路的最小是多少. 思 ...

  3. POJ 2455 Secret Milking Machine

    POJ_2455 每条路只走一次可以通过网络流来保证,而对于让最长的边最小可以通过二分枚举来搞定. #include<stdio.h> #include<string.h> # ...

  4. POJ 2112 Optimal Milking(二分+最大流)

    POJ 2112 Optimal Milking 题目链接 题意:给定一些机器和奶牛,在给定距离矩阵,(不在对角线上为0的值代表不可达),每一个机器能容纳m个奶牛.问全部奶牛都能挤上奶,那么走的距离最 ...

  5. Secret Milking Machine POJ - 2455

    点击打开链接 二分最大边 记为lim 不超过lim的边容量记为1 否则记为0 再抽象一个源点 从源点到1的容量为题目所给的t 然后以此建图 看是否满流 感觉网络流的抽象建图很关键 这道题看了别人的建图 ...

  6. POJ2455 Secret Milking Machine【二分,最大流】

    题目大意:N个点P条边,令存在T条从1到N的路径,求路径上的边权的最大值最小为多少 思路:做了好多二分+最大流的题了,思路很好出 二分出最大边权后建图,跑dinic 问题是....这题是卡常数的好题! ...

  7. poj2455 Secret Milking Machine(二分答案+最大流)

    二分答案,双向边网络流,反向边容量直接设为val即可.可以选择的边容量为1,跑最大流,看是否满流(是否存在K条路径). #include <cstdio> #include <cst ...

  8. BZOJ1733: [Usaco2005 feb]Secret Milking Machine 神秘的挤奶机

    n<=200个点m<=40000条边无向图,求   t次走不经过同条边的路径从1到n的经过的边的最大值   的最小值. 最大值最小--二分,t次不重边路径--边权1的最大流. 1 #inc ...

  9. 【POJ 3273】 Monthly Expense (二分)

    [POJ 3273] Monthly Expense (二分) 一个农民有块地 他列了个计划表 每天要花多少钱管理 但他想用m个月来管理 就想把这个计划表切割成m个月来完毕 想知道每一个月最少花费多少 ...

最新文章

  1. 页面的前进/后退/刷新方法
  2. C++迭代器iterator
  3. Arduino可穿戴教程之第一个程序——选择端口(三)
  4. CVPR 2021 比CNN和Transformer更好的Backbone?伯克利谷歌提出BoTNet,精度达84.7%
  5. P2340 奶牛会展(状压dp)
  6. jquery实现倒计时
  7. Web 应用服务器端渲染入门指南
  8. 聚类(Clustering):hierarchical clustering 层次聚类及其应用
  9. 案例 实现文件读写器 c# 1614523907
  10. [安卓]AndroidManifest.xml文件简介及结构
  11. 3D模型欣赏:《Sword girl》古风 女战士角色 次世代 zbrush雕刻
  12. 动平衡仪制作方法总结
  13. 安卓机顶盒安装软件教程
  14. Vue动态加载本地磁盘图片
  15. 办公小技巧,批量修改文件名,手把手教你
  16. 采访UI设计师Kiro
  17. 【uni-app】懂你找图--创建项目到首页推荐模块
  18. 产品基础训练 - Persona[用户画像]
  19. argument type mismatch
  20. 单片机数据上传到阿里云物联网平台后,如何在手机端和网页端获取获取数据?

热门文章

  1. c++强大还是python强大-2020,你该学习Python还是C++
  2. python做软件-用python做个翻译小软件吧~
  3. python运行非常慢的解决-python为什么会运行慢
  4. java和python哪个好就业2020-java和python哪个的前途更好?
  5. python入门编程题库-Python随笔30:Python基础编程练习题25~26
  6. python掌握程度怎么判断-Python数据分析路上,温故而知新
  7. python升级版本命令-pythonpip命令版本过低问题版本升级问题
  8. python3基础语法-Python3的一些基础语法介绍和理解
  9. python可以用来做什么-Python 学会之后可以用来干嘛的?
  10. python读取中文txt文本-python读取中文txt文本的方法