HDU-4280-Island Transport(网络流,最大流, ISAP)
链接:
https://vjudge.net/problem/HDU-4280
题意:
In the vast waters far far away, there are many islands. People are living on the islands, and all the transport among the islands relies on the ships.
You have a transportation company there. Some routes are opened for passengers. Each route is a straight line connecting two different islands, and it is bidirectional. Within an hour, a route can transport a certain number of passengers in one direction. For safety, no two routes are cross or overlap and no routes will pass an island except the departing island and the arriving island. Each island can be treated as a point on the XY plane coordinate system. X coordinate increase from west to east, and Y coordinate increase from south to north.
The transport capacity is important to you. Suppose many passengers depart from the westernmost island and would like to arrive at the easternmost island, the maximum number of passengers arrive at the latter within every hour is the transport capacity. Please calculate it.
思路:
考虑无向图,只需给反向边加上容量,同时图的点很多,使用ISAP算法.
找了很久,看了很久..找的代码bfs写错了(貌似?).最后很久才改出来.
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5+10;
const int INF = 1e9;
struct Edge
{
int from, to, flow, cap;
};
int Pre[MAXN], Cur[MAXN];
int Num[MAXN], Vis[MAXN];
int Dis[MAXN];
vector<int> G[MAXN];
vector<Edge> edges;
int n, m, s, t;
void AddEdge(int from, int to, int cap)
{
edges.push_back(Edge{from, to, 0, cap});
edges.push_back(Edge{to, from, 0, cap});
int len = edges.size();
G[from].push_back(len - 2);
G[to].push_back(len - 1);
}
void Bfs()
{
memset(Vis, 0, sizeof(Vis));
queue<int> que;
que.push(t);
Vis[t] = 1;
Dis[t] = 0;
while (!que.empty())
{
int u = que.front();
que.pop();
for (int i = 0;i < G[u].size();i++)
{
Edge &e = edges[G[u][i]^1];
if (Vis[e.from] == 0 && e.cap > e.flow)
{
Vis[e.from] = 1;
que.push(e.from);
Dis[e.from] = Dis[u]+1;
}
}
}
}
int Augment()
{
// cout << 1 << endl;
int x = t, flow = INF;
while (x != s)
{
Edge &e = edges[Pre[x]];
// cout << e.from << ' ' << e.to << endl;
flow = min(flow, e.cap-e.flow);
x = e.from;
}
// cout << flow << endl;
x = t;
while (x != s)
{
edges[Pre[x]].flow += flow;
edges[Pre[x]^1].flow -= flow;
x = edges[Pre[x]].from;
}
return flow;
}
int MaxFlow()
{
int flow = 0;
Bfs();
memset(Num, 0, sizeof(Num));
for (int i = 0;i < n;i++)
Num[Dis[i]]++;
int x = s;
memset(Cur, 0, sizeof(Cur));
while (Dis[s] < n)
{
if (x == t)
{
flow += Augment();
x = s;
}
bool ok = false;
for (int i = Cur[x];i < G[x].size();i++)
{
Edge &e = edges[G[x][i]];
if (e.cap > e.flow && Dis[x] == Dis[e.to]+1)
{
ok = true;
Pre[e.to] = G[x][i];
Cur[x] = i;
x = e.to;
break;
}
}
if (!ok)
{
int line = n-1;
for (int i = 0;i < G[x].size();i++)
{
Edge &e = edges[G[x][i]];
if (e.cap > e.flow)
line = min(line, Dis[e.to]);
}
if (--Num[Dis[x]] == 0)
break;
Dis[x] = line+1;
Num[Dis[x]]++;
Cur[x] = 0;
if (x != s)
x = edges[Pre[x]].from;
}
}
return flow;
}
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
scanf("%d %d", &n, &m);
for (int i = 1;i <= n;i++)
G[i].clear();
edges.clear();
int mmin = INF, mmax = -INF;
int u, v, w;
for (int i = 1;i <= n;i++)
{
scanf("%d %d", &u, &v);
if (u < mmin)
s = i, mmin = u;
if (u > mmax)
t = i, mmax = u;
}
for (int i = 1;i <= m;i++)
{
scanf("%d %d %d", &u, &v, &w);
AddEdge(u, v, w);
}
int res = MaxFlow();
printf("%d\n", res);
}
return 0;
}
HDU-4280-Island Transport(网络流,最大流, ISAP)的更多相关文章
- Hdu 4280 Island Transport(最大流)
Island Transport Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- HDU 4280 Island Transport(网络流)
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:pid=4280">http://acm.hdu.edu.cn/showproblem.php ...
- HDU 4280 Island Transport(网络流,最大流)
HDU 4280 Island Transport(网络流,最大流) Description In the vast waters far far away, there are many islan ...
- HDU 4280 Island Transport(无向图最大流)
HDU 4280:http://acm.hdu.edu.cn/showproblem.php?pid=4280 题意: 比较裸的最大流题目,就是这是个无向图,并且比较卡时间. 思路: 是这样的,由于是 ...
- HDU 4280 Island Transport
Island Transport Time Limit: 10000ms Memory Limit: 65536KB This problem will be judged on HDU. Origi ...
- HDU 4280 Island Transport(dinic+当前弧优化)
Island Transport Description In the vast waters far far away, there are many islands. People are liv ...
- HDU 4280 Island Transport(HLPP板子)题解
题意: 求最大流 思路: \(1e5\)条边,偷了一个超长的\(HLPP\)板子.复杂度\(n^2 \sqrt{m}\).但通常在随机情况下并没有isap快. 板子: template<clas ...
- HDU4280:Island Transport(最大流)
Island Transport Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- POJ 1459-Power Network(网络流-最大流-ISAP)C++
Power Network 时间限制: 1 Sec 内存限制: 128 MB 题目描述 A power network consists of nodes (power stations, cons ...
随机推荐
- 【flask_sqlalchemy】动态CURD类
环境: flask_sqlalchemy mysql from app import db class Curd(object): def __init__(self,modelName): self ...
- Vue项目移动端滚动穿透问题
概述 今天在做 Vue 移动端项目的时候遇到了滚动穿透问题,在网上查资料后,选取了我觉得最好的方法,记录下来供以后开发时参考,相信对其他人也有用. 上层无需滚动 如果上层无需滚动的话,直接屏蔽上层的 ...
- 【Java安全】关于Java中常用加密/解密方法的实现
安全问题已经成为一个越来越重要的问题,在Java中如何对重要数据进行加密解密是本文的主要内容. 一.常用的加密/解密算法 1.Base64 严格来说Base64并不是一种加密/解密算法,而是一种编码方 ...
- PHP is_file() 函数
is_file() 函数检查指定的文件名是否是正常的文件. 语法is_file(file)参数 描述file 必需.规定要检查的文件.说明如果文件存在且为正常的文件,则返回 true. 提示和注释 注 ...
- eslint+prettier 的 VSCode配置项
{ "files.autoSave": "off", "editor.fontSize": 12, "terminal.integ ...
- maven spark Scala idea搭建maven项目的 pom.xml文件配置
1.pom.xml文件配置,直接上代码. <?xml version="1.0" encoding="UTF-8"?> <project xm ...
- 006 Notepad++ 运行 C/C++
目录 0. 前言 1. 准备 2. 开工 setp 1 step 2 step 3 step 4 step 5 step 6 3. 修改与删除 3.1修改名称.快捷键 3.2 删除 4. 运行 5. ...
- 【监控笔记】【1.5】事件通知(event Notification)
关键词:DDL监控 [监控笔记][1.5]事件通知(event Notification) 注意,只能通过删除新建来修改事件. [1]概念 事件通知是特殊类型的数据库对象,用于将有关服务器和数据库实践 ...
- PL/SQL基本操作
1.常规过程化形式 declare o_booking_flag ); begin -- Call the procedure destine_ticket(', , 'E', , o_booking ...
- JSP技术学习总结
1.JSP的执行过程 首先用户向服务器发出请求,服务器在接收请求后去寻找响应的jsp页面,然后服务器将jsp页面翻译成.java文件,然后进行编译得到.class字节码文件,服务器执行class文件将 ...