//Created by pritry
int graph[MAX][MAX]; //原图
int source; //起点,这里为0
int sink; //终点,这里为n-1
int e[MAX]; //余流
int h[MAX]; //高度
int n; //顶点数
struct Label
{
int index;
friend bool operator < (const Label& a, const Label& b)
{
return h[a.index] > h[b.index];
}
};
void Push(int u, int v)
{
int df = min(e[u], graph[u][v]);
graph[u][v] -= df;
graph[v][u] += df;
e[u] -= df;
e[v] += df;
}
void Relabel(int u)
{
int min_h = INF;
for(int i = ; i < n; ++i)
{
if(graph[u][i] && h[i] < min_h)
{
min_h = h[i];
}
}
h[u] = min_h + ;
}
int HLPP()
{
int i;
Label l;
priority_queue<Label> Q;
memset(e, , sizeof(e));
memset(h, , sizeof(h));
h[source] = n;
for(i = ; i < n; ++i)
{
if(graph[source][i])
{
int df = graph[source][i];
e[source] -= df;
e[i] += df;
graph[source][i] -= df;
graph[i][source] += df;
l.index = i;
if(i != source && i != sink) Q.push(l);
}
}
while(!Q.empty())
{
l = Q.top();
Q.pop();
int u = l.index;
while(e[u])
{
for(i = ; i < n; ++i)
if(graph[u][i] && h[u] > h[i])
break; if(i == n) Relabel(u); for(i = ; i < n; ++i)
{
if(h[u] == h[i] + && graph[u][i])
{
Push(u, i);
l.index = i;
if(e[i] > && i != source && i != sink) Q.push(l);
}
}
}
}
return e[sink];
}

最新文章

  1. 深入理解Java:内部类
  2. web----test-----selenium
  3. AIX 文件 打包 与 压缩 tar gzip compress 的使用
  4. Drupal 7.31SQL注入getshell漏洞利用详解及EXP
  5. spfa(模板)
  6. pybombs 安装
  7. Linux下通过ioctl系统调用来获取和设置网络信息
  8. Ehcache(2.9.x) - Configuration Guide, Configuring Storage Tiers
  9. 学习Cassandra资料的一些整理
  10. 运算符 - PHP手册笔记
  11. 对TCP说三道四(三次握手)
  12. 201521123023《Java程序设计》第五周学习总结
  13. 干货!一次kafka卡顿事故排查过程
  14. Mac定时关机、重启、休眠命令行
  15. AI tensorflow MNIST
  16. Confluence 6 其他需要备份和恢复的地方
  17. Java 接口 Comparable
  18. Oracle中,如何将String插入到BLOB类型字段
  19. 接口app 接口中上传 图片
  20. HTTP/HLS/RTMP超级负载测试工具

热门文章

  1. PHP array_intersect_uassoc()
  2. BC ROUND 43# 03 HDU 5266
  3. Spring面试总结
  4. vim快速操作
  5. 使用汇编分析c代码的内存分布
  6. WPF中控件TextBlock使用(简单)
  7. 动手分析安卓仿QQ联系人列表TreeView控件
  8. CH Round #24 - 三体杯 Round #1-C 逃不掉的路
  9. Google Chrome调试常用快捷键
  10. lowbit( )运算