HDU 4411 Arrest
2016-06-24 21:03
417 查看
http://www.cnblogs.com/jianglangcaijin/archive/2012/09/24/2700509.html
思路:
S->0 流量为K费用0
0->i 流量为inf,费用为a[0][i]
0->T 流量为K,费用0
i->i+n 流量为1,费用为-inf
i+n->T 流量为1,费用为a[0][i]
思路:
S->0 流量为K费用0
0->i 流量为inf,费用为a[0][i]
0->T 流量为K,费用0
i->i+n 流量为1,费用为-inf
i+n->T 流量为1,费用为a[0][i]
#include<algorithm> #include<cstdio> #include<cmath> #include<cstring> #include<iostream> #define inf 1000000 int a[505][505],K; int tot,go[200005],next[200005],first[200005],cost[200005],flow[200005]; int op[200005],dis[200005],c[200005],vis[200005],edge[200005],from[200005]; int S,T,n,m,ans; int read(){ char ch=getchar();int t=0,f=1; while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';ch=getchar();} return t*f; } void insert(int x,int y,int z,int l){ tot++; go[tot]=y; next[tot]=first[x]; first[x]=tot; flow[tot]=z; cost[tot]=l; } void add(int x,int y,int z,int l){ insert(x,y,z,l);op[tot]=tot+1; insert(y,x,0,-l);op[tot]=tot-1; } bool spfa(){ for (int i=0;i<=T;i++) dis[i]=0x3f3f3f3f,vis[i]=0; int h=1,t=1;c[1]=S;vis[S]=1;dis[S]=0; while (h<=t){ int now=c[h++]; for (int i=first[now];i;i=next[i]){ int pur=go[i]; if (dis[pur]>dis[now]+cost[i]&&flow[i]){ dis[pur]=dis[now]+cost[i]; edge[pur]=i; from[pur]=now; if (vis[pur]) continue; vis[pur]=1; c[++t]=pur; } } vis[now]=0; } return dis[T]!=0x3f3f3f3f; } void updata(){ int mn=0x3f3f3f3f; for (int i=T;i!=S;i=from[i]){ mn=std::min(mn,flow[edge[i]]); } for (int i=T;i!=S;i=from[i]){ ans+=mn*cost[edge[i]]; flow[edge[i]]-=mn; flow[op[edge[i]]]+=mn; } } int main(){ while (scanf("%d",&n)!=EOF){ m=read();K=read(); if (n==0&&K==0&&m==0) return 0; for (int i=0;i<=T;i++) first[i]=0;tot=0; S=2*n+1;T=S+1; for (int i=0;i<=n;i++) for (int j=0;j<=n;j++) if (i==j) a[i][j]=0; else a[i][j]=0x3f3f3f3f; while(m--){ int u=read(),v=read(),w=read(); a[u][v]=std::min(a[u][v],w); a[v][u]=std::min(a[v][u],w); } for (int k=0;k<=n;k++) for (int i=0;i<=n;i++) for (int j=0;j<=n;j++) a[i][j]=std::min(a[i][j],a[i][k]+a[k][j]); add(S,0,K,0); add(0,T,K,0); for (int i=1;i<=n;i++) if (a[0][i]<0x3f3f3f3f) add(0,i,inf,a[0][i]); for (int i=1;i<=n;i++) for (int j=i+1;j<=n;j++) if (a[i][j]<0x3f3f3f3f) add(i+n,j,1,a[i][j]); for (int i=1;i<=n;i++) if (a[0][i]<0x3f3f3f3f) add(i+n,T,1,a[0][i]); for (int i=1;i<=n;i++) add(i,i+n,1,-inf); ans=inf*n; while (spfa()) updata(); printf("%d\n",ans); } }
相关文章推荐
- 剑指offer-数据结构:字符串(基础知识)
- 世事无常瑞郎风暴恍如昨日,英国脱欧翻江倒海青出于蓝
- 提高项目7-太乐
- 仿函数可配接性探讨
- fblualib安装教程
- GeekBand c++學習筆記之八(泛型算法)
- Python中父类和子类间类属性(非实例属性)的设置获取的传递
- php 后期静态绑定 static 关键字的另一种用法
- 通过sdk工具 aapt.exe 获取apk的信息
- Serialize and Deserialize Binary Tree
- 圆排列【算法作业】
- Java设计模式——适配器模式
- 一切成功源于积累——20160624 英国脱欧盟 镑美18000点 黄金10000点
- 字符驱动移植--bus(平台总线), device, driver
- 共同学习Java源代码--数据结构--ArrayList类(七)
- 深入理解Java的接口和抽象类
- HDU4521线段树
- hibernate实体类(主键生成、date日期、枚举类型)
- Mysql数据库调优和性能优化的21条最佳实践
- 纸牌游戏之五 主界面类