HDU3917 最大权闭合图
来源:互联网 发布:手机屏幕挂件软件 编辑:程序博客网 时间:2024/05/22 03:41
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=3917
题目就是最大权闭合图的模板题,,然后ek会t于是上网学了一发sap。
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <queue>#define FF(i,NV) for(int i=0;i<NV;i++)using namespace std;const int M = 1000004;const int INF = 0x3f3f3f3f;int n, m;struct Node{ int c,pos,next;} E[M*4];struct Sap{ int NE,NV,tot; int gap[M],dis[M],pre[M],head[M],cur[M]; void init() { NE=0,tot=0; NV=m+1 + 1; memset(head, -1, sizeof(head)); } int sap(int s,int t) { memset(dis,0,sizeof(int)*(NV+1)); memset(gap,0,sizeof(int)*(NV+1)); FF(i,NV) cur[i] = head[i]; int u = pre[s] = s,maxflow = 0,aug =INF; gap[0] = NV; while(dis[s] < NV) { loop: for(int &i = cur[u]; i != -1; i = E[i].next) { int v = E[i].pos; if(E[i].c && dis[u] == dis[v] + 1) { aug=min(aug,E[i].c); pre[v] = u; u = v; if(v == t) { maxflow += aug; for(u = pre[u]; v != s; v = u,u = pre[u]) { E[cur[u]].c -= aug; E[cur[u]^1].c += aug; } aug =INF; } goto loop; } } if( (--gap[dis[u]]) == 0) break; int mindis = NV; for(int i = head[u]; i != -1 ; i = E[i].next) { int v = E[i].pos; if(E[i].c && mindis > dis[v]) { cur[u] = i; mindis = dis[v]; } } gap[ dis[u] = mindis+1 ] ++; u = pre[u]; } return maxflow; } void AddEdge(int u,int v,int c ) { E[NE].c = c; E[NE].pos = v; E[NE].next = head[u]; head[u] = NE++; E[NE].c = 0; E[NE].pos = u; E[NE].next = head[v]; head[v] = NE++; }}sek;int sum[100004];int zsum;int a[100004], b[100004], c[100004], d[100004];int main(){ while(scanf("%d%d", &n, &m), (n||m)) { memset(sum, 0, sizeof(sum)); zsum = 0; sek.init(); for(int i = 1;i <= m;i++) { int ls; scanf("%d", &ls); sek.AddEdge(0, i, ls); zsum += ls; } int k; scanf("%d", &k); for(int i = 1;i <= k;i++) { int q, w, e, r; scanf("%d%d%d%d", &q, &w, &e, &r); a[i] = q, b[i] = w, c[i] = e, d[i] = r; sum[c[i]] += r; } for(int i = 1;i <= k;i++) { for(int j = 1;j <= k;j++) { if(i != j) { if(b[i] == a[j] && c[i] != c[j]) { sek.AddEdge(c[i], c[j], INF); } } } } for(int i = 1;i <= m;i++) { sek.AddEdge(i, m + 1, sum[i]); } printf("%d\n", zsum - sek.sap(0, m + 1)); } return 0;}
阅读全文
0 0
- HDU3917 最大权闭合图
- HDU3917 Road constructions 最大权闭合图
- 最大权闭合图(Road constructions)hdu3917
- HDU3917 Road constructions 最大权闭合图 2011 Multi-University Training Contest 8 - Host by HUST
- 最大权闭合图
- 最大权闭合图
- 最大权闭合图
- 最大权闭合图
- 最大权闭合图
- 最大权闭合图
- 最大权闭合图
- 最大权闭合图
- 最大权闭合图
- 最大权闭合图
- 最大权闭合图
- 最大权闭合图
- 最大权闭合图
- 最大权闭合图
- Java -- Runnable
- 怎么让代码的逻辑更清晰?
- Oracle归档模式下恢复-4种数据库完全恢复方法
- js 判断一个 object 对象是否为空
- PHP 实现多网站共享用户SESSION 数据解决方案
- HDU3917 最大权闭合图
- win7+VS2008安装boost
- IDEA插件配置之Eclipse Code Formatter
- Spark_任务执行过程
- ThreadLocal
- Centos搭建mysql、php、nginx、ftp,shell脚本
- 数据库创建
- mxnet im2rec 使用
- 滑动解锁