HDU 6188最小费用流
题目链接:http://hdu.hustoj.com/showproblem.php?pid=6118
掉坑里了,图很好建,Wa了一发,看了Disscuss里面有人提供了一组样例,画图发现:最小流模板是在满足最大流情况下的最小费用,而本题目不需要满足最大流直接求最小费用。注意一下。
/*
5 4
1 2 1 2
2 1 2 1
2 3 4 5
5 4 3 2
100 1 1 1
1 2 1
2 3 1
3 4 1
1 5 1
*/
应该输出8的。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 4e3;
const int INF = 1e9;
int dist[maxn];
int tot,head[maxn];
int pv[maxn],pe[maxn];
struct edge
{
int to,pre,cap,cost;
}e[];
typedef pair<int,int> P;
void init()
{
tot = ;
memset(head,-,sizeof(head));
}
void add(int from,int to,int cap,int cost)
{
e[tot].pre = head[from];
e[tot].to = to;
e[tot].cap = cap;
e[tot].cost = cost;
head[from] = tot++;
}
void addedge(int from,int to,int cap,int cost)
{
add(from,to,cap,cost);
add(to,from,,-cost);
}
int ans = ;
int min_cost_flow(int s,int t,int f,int& max_flow)
{
int ret = ;
while(f>)
{
priority_queue<P,vector<P>,greater<P> >q;
for(int i=;i<maxn;i++) dist[i] = INF;
dist[s] = ;
q.push(P(,s));
while(!q.empty())
{
P cur = q.top(); q.pop();
int v = cur.second;
if(dist[v]<cur.first) continue;
for(int i=head[v];i>=;i=e[i].pre)
{
int to = e[i].to,cap = e[i].cap,cost = e[i].cost;
if(cap>&&dist[to]>dist[v]+cost)
{
pv[to] = v,pe[to] = i;
dist[to] = dist[v] + cost;
q.push(P(dist[to],to));
}
}
}
if(dist[t]==INF) return ret;
///当所有边的流量都流净后,即没有残余网络,返回。
int d = f;
for(int v=t;v!=s;v=pv[v])
{
d = min(d,e[pe[v]].cap);
}
f -= d;
max_flow += d;
ans = min(ans,ret);
ret += d*dist[t]; ///走一单位就消耗dist[t]
for(int v=t;v!=s;v=pv[v])
{
e[pe[v]].cap -= d;
e[pe[v]^].cap += d;
}
}
return ret;
}
int a[maxn],b[maxn],c[maxn],d[maxn];
int main()
{
int n,m;
while(scanf("%d %d",&n,&m)!=EOF)
{
int s=,t=;
init(); //别忘写
for(int i=;i<=n;i++)
{
scanf("%d %d %d %d",&a[i],&b[i],&c[i],&d[i]);
}
for(int i=;i<=n;i++)
{
addedge(s,i,b[i],a[i]);
addedge(i,t,d[i],-c[i]);
}
for(int i=;i<=m;i++)
{
int u,v,k;
scanf("%d %d %d",&u,&v,&k);
addedge(u,v,INF,k);
addedge(v,u,INF,k);
}
int maxflow = ;
ans = ;
min_cost_flow(s,t,INF,maxflow);
if(ans>=) printf("0\n");
else printf("%d\n",-ans);
}
return ;
}
/*
5 4
1 2 1 2
2 1 2 1
2 3 4 5
5 4 3 2
100 1 1 1
1 2 1
2 3 1
3 4 1
1 5 1
*/
HDU 6188最小费用流的更多相关文章
- HDU 6188:Duizi and Shunzi(贪心)(广西邀请赛)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6188 题意 有n个数字,每个数字小于等于n,两个相同的数字价值为1,三个连续的数字价值为1 .问这n个 ...
- HDU 6188 Duizi and Shunzi 贪心
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6188 题意:给了n个数,然后现在问我们最多构成多少个对子和顺子,其中对子是2个相同的牌,顺子是3个连续 ...
- Going Home (hdu 1533 最小费用流)
集训的图论都快结束了,我才看懂了最小费用流,惭愧啊. = = 但是今天机械键盘到了,有弄好了自行车,好高兴\(^o^)/~ 其实也不是看懂,就会套个模板而已.... 这题最重要的就是一个: 多组输入一 ...
- hdu 1853 最小费用流好题 环的问题
Cyclic Tour Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Others) Tota ...
- hdu 4744 最小费用流
#include <cstdio> #include <queue> #include <cstring> #include <cmath> #defi ...
- hdu 4494 最小费用流
思路:这题我在下午重现的时候就用的费用流做,可是各种悲催的超时,只是我一开始的那种建图方式多了一个二分查找. 戏剧性的是,求距离的返回值写成int型了,CodeBlock编译器又没有警告,然后就WA啊 ...
- hdu 4411 最小费用流
思路:主要就是要把一个每个城市拆为两个点,建一条容量为1,费用为-inf的边,保证每个城市都会被遍历. /*最小费用最大流*/ #include<iostream> #include< ...
- HDU 6188 Duizi and Shunzi
栈. 将数字排序后,一个一个压入栈.如果栈顶两个元素形成了对子,那么$ans+1$,弹出栈顶两个元素:如果栈顶三个元素形成了顺子,那么$ans+1$,弹出栈顶三个元素. #include<bit ...
- HDU - 6188
用vis表贪心异常方便 #include<bits/stdc++.h> #define rep(i,j,k) for(register int i=j;i<=k;i++) #defi ...
随机推荐
- hibernate简介以及简单配置
Hibernate简介: Hibernate是一个开源对象关联关系映射的框架,他对JDBC做了轻量级的封装,使我们可以通过面向对象的思想操作数据库. 为什么要用Hibernate: 1: 对JDBC访 ...
- poj 2236 网络连接问题 并查集
题意:n台电脑,当两台之间的距离小于d的时候可以连接. 题目会进行操作“修复”还有“查询是否已经连接”.只要在查询的时候输出YES或者ON 思路: 把可以相互连接的 即两者之间的距离小于 d q[i ...
- Linux优化总结
1)netstat (*****)查看网络状态lntup或an 1.[listening|-l] 2.[--numeric|-n] 3.[--tcp|-t] 4.[--udp|-u] 5[--prog ...
- flask-用户资料
首先创建User模型 class User(UserMixin,db.Model): __tablename__ = 'users' #.. name = db.Column(db.String(64 ...
- matlab callback 数据传递
M文件中内的每个Callback都可以视为一个独立的可执行的接口,因此,任一个Callback触发后所执行的运算值若要在其他Callback中使用,就无法与MATLAB工作空间内的变量继续执行操作,也 ...
- Java-创建一个线程
第一种继承Thread类 package com.tj; public class BasicThread1 extends Thread { public void run() { System.o ...
- Leetcode 483.最小好进制
最小好进制 对于给定的整数 n, 如果n的k(k>=2)进制数的所有数位全为1,则称 k(k>=2)是 n 的一个好进制. 以字符串的形式给出 n, 以字符串的形式返回 n 的最小好进制. ...
- Mark Down 简单标记语言
MarkDown介绍=============== ## 1.标题分级介绍 #一级标题###三级标题######六级标题 一级标题============== 二级标题---------------- ...
- EOJ Monthly 2018.4
A. ultmaster 的小迷妹们 Time limit per test: 2.0 seconds Memory limit: 256 megabytes ultmaster 男神和他的小迷妹们准 ...
- 【Go】Panic函数
panic(运行时恐慌)是一种只会在程序运行时才回抛出来的异常.在panic被抛出之后,如果没有在程序里添加任何保护措施的话,程序就会在打印出panic的详情,终止运行. 如果一个panic是无意间引 ...