UVA - 1658 Admiral (最小费用最大流)
2024-08-28 22:08:13
最短路对应费用,路径数量对应流量。为限制点经过次数,拆点为边。跑一次流量为2的最小费用最大流。
最小费用最大流和最大流EK算法是十分相似的,只是把找增广路的部分换成了求费用的最短路。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll; const int maxv = +;
const int maxe = +; struct Edge
{
int v,cap,cost,nxt;
void IN(int V,int C,int c,int N)
{
v = V; cap = C; cost = c; nxt = N;
}
}edges[maxe]; int head[maxv],ecnt,vcnt; void AddEdge(int u,int v,int C,int c)
{
edges[ecnt].IN(v,C,c,head[u]);
head[u] = ecnt++;
edges[ecnt].IN(u,,-c,head[v]);
head[v] = ecnt++;
}
const int INF = 0x3f3f3f3f;
int S,T;
bool vis[maxv];
int d[maxv],p[maxv],a[maxv];
bool spfa()
{
memset(d,0x3f,sizeof(int)*vcnt);
memset(vis,,sizeof(bool)*vcnt); queue<int> q; q.push(S); d[S] = ;
a[S] = INF;
while(q.size()){
int u = q.front(); q.pop();
vis[u] = false;
for(int i = head[u]; ~i; i = edges[i].nxt){
Edge &e = edges[i];
if(e.cap&& d[e.v] > d[u]+e.cost){
d[e.v] = d[u] + e.cost;
p[e.v] = i;
a[e.v] = min(a[u],e.cap);
if(!vis[e.v]) { q.push(e.v); vis[e.v] = true; }
}
}
}
return d[T] != INF;
} ll MinCostMaxFlow()
{
ll cost = ;
while(spfa()){
cost += d[T];
for(int i = T; i != S; i = edges[p[i]^].v){
edges[p[i]].cap -= a[T];
edges[p[i]^].cap += a[T];
}
}
return cost;
} int pin[maxv],pout[maxv]; int main()
{
//freopen("in.txt","r",stdin);
int v,e;
int S = ; T = ;
while(~scanf("%d%d",&v,&e)){ vcnt = ; ecnt = ;
pin[] = pout[] = vcnt++;
pin[v] = pout[v] = vcnt++;
for(int i = ; i < v; i++) {
pin[i] = vcnt++;
pout[i] = vcnt++;
}
memset(head,-,sizeof(int)*(vcnt));
AddEdge(S,pin[],,);
AddEdge(pout[v],T,,);
for(int i = ; i < v; i++) AddEdge(pin[i],pout[i],,);
while(e--){
int u,v,c; scanf("%d%d%d",&u,&v,&c);
AddEdge(pout[u],pin[v],,c);
}
printf("%lld\n",MinCostMaxFlow());
}
return ;
}
最新文章
- Class.forName和ClassLoader.loadClass等
- 解决Win7下VC6.0插入ActiveX控件对话框为空的问题
- Yocto开发笔记之《工具使用:TFTP &; NFS &; SSH》(QQ交流群:519230208)
- activity栈的关系
- 5.1 stack,queue以及priority_queue
- IT书籍的选择与阅读
- Poj(3615),Floyd,最大值中的最小值
- String性能优化
- Java 关于中文乱码处理的经验总结【转载】
- 安装JDK设置环境变量
- spring框架总结(01)
- js == 和 ===
- Lumen框架-错误&;日志
- c/c++线性循环队列
- bzoj2721 [Violet5]樱花
- 安装VC++2015运行库时出现0x80240037错误
- 【译】第七篇 SQL Server安全跨数据库所有权链接
- solr入门
- ELK技术实战-安装Elk 5.x平台
- Ball CodeForces - 12D (线段树)