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 ...
随机推荐
- 【WPF异常】在使用 ItemsSource 之前,项集合必须为空
<DataGrid x:Name=" AutoGenerateColumns="False" GridLinesVisibility="None" ...
- yield(),sleep()以及wait()的区别
往往混淆了这三个函数的使用. 从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列).并且在某一时刻cpu只为ready queue中位于队列头部的线程服务. 但是当前正在被服务的 ...
- Redis启动命令
Redis的下载地址为https://github.com/MicrosoftArchive/redis/releases,Redis 支持 32 位和 64 位,根据自己的需要下载相应的版本. 下载 ...
- kafka学习(三)
kafka 消费者-从kafka读取数据 消费者和消费者群里 kafka消费者从属于消费者群组.一个群组里的消费者订阅的是同一主题,每个消费者接受主题一部分分区的消息.如果我们往群组里添加更多的消 ...
- 红帽学习笔记[RHCSA] 第二课[文件、目录、相关命令]
第二课 常用的目录结构与用途 / 根目录 /boot 存储的是系统起动时的信息和内核等 /dev 存储的是设备文件 /etc 存储的是系统的配置文件 /root 存储的是root用户的家目录 /hom ...
- [转帖]华为海思Hi1620芯片发布在即 7nm制程ARM架构最高可达3.0GHz
华为海思Hi1620芯片发布在即 7nm制程ARM架构最高可达3.0GHz https://www.cnbeta.com/articles/tech/850561.htm 中电科旗下的普华软件 支持国 ...
- oracle_fdw安装及使用(无法访问oracle存储过程等对象)
通过oracle_fdw可以访问oracle中的一些表和视图,也可以进行修改,尤其是给比较复杂的系统使用非常方便. (但不能使用oracle_fdw来访问oracle的存储过程.包.函数.序列等对象) ...
- vue 还原Data里面的数据
this.$data包含现有的data数据, this.$options.data()中是原有的data数据 还原代码 Object.assign(this.$data.searchForm, thi ...
- qt undefined reference to `vtable for subClass'
1. 建立一个console工程 QT -= gui CONFIG += c++ console CONFIG -= app_bundle # The following define makes y ...
- Javascript的是三种字符串连接方式
第一种:用连接符“+”连接字符串 str="a"; str+="b"; 这种方法相对以下两种,最便捷快速.建议100字符以下的连接使用这种连接方式. 第二种:以 ...