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 ...
随机推荐
- svn访问版本库时一直提示: please wait while the repository browser is initializing
最近不知道做了什么操作,原来正常的SVN Check In/Out都无法正常操作. 正常Check In的动作,几秒钟就会操作完成,但是我却等了好久好久,然后提示Connection timed ou ...
- JVM监控工具之JProfiler
一.简介 JProfiler是一款Java的性能监控工具.可以查看当前应用的对象.对象引用.内存.CPU使用情况,线程运行情况(阻塞.等待等),同时可以查找哪个对象占用的内存比较多.哪个对象占用CPU ...
- vue组件之间通信总结---点赞
总结:父组件-->子组件 ①通过属性 步骤1: <son myName="michael" myPhone='123'></son> <son ...
- 多变量分析绘图(hue参数)以及盒图和小提琴图
1,函数stipplot() stipplot()函数用来画散点图,其x轴是离散型的变量 直接上代码 import seaborn as sns import numpy as np import p ...
- 【Qt开发】几个傻不拉几关于char*和const char*的不兼容问题
1. string转const char* string s ="abc";constchar* c_s = s.c_str(); 2. const char*转string ...
- postfix无法启动问题
open /etc/postfix/main.cf comment out inet_interfaces: all add inet_protocol: ipv4
- ubutu16.04编译安装apache
// 安装编译器 sudo apt-get install build-essential // 下载所需依赖及apache2源码包 wget --no-check-certificate https ...
- P1474货币系统
这是USACO的一道DP题,难度是提高—. 这道题是告诉我们货币种类,问你用这些货币组成一个面值最大有多少种方案.第一眼看上去想用dfs记忆化,随后发现其实这个题很类似于完全背包,可以取无线件,但是他 ...
- zebra代码分析
http://blog.csdn.net/xuyanbo2008/article/details/7439738
- CentOS卸载lamp环境的步骤
学习PHP的时候需要在CentOS系统下安装lamp环境,安装容易卸载就没那么简单了,因为lamp由Apache.MySQL.PHP三个部分构成,需要逐个卸载,小编就给大家介绍下CentOS卸载lam ...