题目:http://acm.hdu.edu.cn/showproblem.php?pid=4411

  1. floyd处理出最短路
  2. 每个点拆为i、i+n,i到i+n连一条容量为1,费用为负无穷的边,代表这个城市必须访问
  3. i+n到j(j>i)分别建边,容量为1,费用为i、j最短路
  4. i+n到汇点建立容量为1费用为g[0][i]的边,代表会警察局
  5. 0到i建立容量为1费用为g[0][i]的边
  6. 0到汇点建立容量为k,费用为0的边,代表有的警察可能一直待在警察局
  7. 源点到0建立容量为k费用为0的边

ps:这题会有重边,以后一定要注意,每道题都要判重!

 #include<bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxv = ;
typedef pair<int,int> P;
struct edge{
int to,cap,cost,rev;
};
int V;
vector<edge> g[maxv];
int h[maxv];
int dist[maxv];
int prevv[maxv],preve[maxv];
void addedge(int from,int to,int cap,int cost){
g[from].push_back(edge{to,cap,cost,g[to].size()});
g[to].push_back((edge{from,,-cost,g[from].size()-}));
}
int solve(int s,int t,int f){
int res = ;
memset(h,,sizeof(h)) ;
while(f > ){
priority_queue<P,vector<P>,greater<P> > que;
memset(dist,inf,sizeof(dist));
dist[s] = ;
que.push(P(,s));
while(!que.empty()){
P p = que.top();
que.pop();
int v = p.second;
if(dist[v] < p.first)
continue;
for(int i = ;i<g[v].size();i++){
edge &e = g[v][i] ;
if(e.cap> && dist[e.to]>dist[v]+e.cost+h[v]-h[e.to]){
dist[e.to] = dist[v]+e.cost+h[v]-h[e.to];
prevv[e.to] = v;
preve[e.to] = i;
que.push(P(dist[e.to],e.to));
}
}
}
if(dist[t] == inf)
return -;
for(int i = ;i<V;i++)
h[i] += dist[i];
int d = f;
for(int v = t;v!=s;v=prevv[v])
d = min(d,g[prevv[v]][preve[v]].cap);
f -= d;
res += d*h[t];
for(int v = t;v!=s;v = prevv[v]){
edge &e = g[prevv[v]][preve[v]];
e.cap -= d;
g[v][e.rev].cap += d;
}
}
return res;
}
int mp[][];
int main(){
int n,m,k;
while(scanf("%d%d%d",&n,&m,&k)){
if(!n && !m && !k)
break;
V = *n+;
int s = *n+,t = *n+;
for(int i = ;i<*n+;i++)
g[i].clear();
memset(mp,inf,sizeof(mp));
for(int i = ;i<=n;i++)
mp[i][i] = ;
int u,v,w;
while(m--){
scanf("%d%d%d",&u,&v,&w);
mp[u][v] = mp[v][u] = min(mp[u][v],w);
}
for(int k = ;k<=n;k++)
for(int i = ;i<=n;i++)
for(int j = ;j<=n;j++)
mp[i][j] = min(mp[i][j],mp[i][k]+mp[k][j]);
for(int i = ;i<=n;i++){
addedge(,i,,mp[][i]);
addedge(i+n,t,,mp[][i]);
addedge(i,i+n,,-);
for(int j = i+;j<=n;j++){
if(mp[i][j] != inf)
addedge(i+n,j,k,mp[i][j]);
}
}
addedge(s,,k,);
addedge(,t,k,);
cout << solve(s,t,k)+n* << endl;
}
return ;
}

HDU4411 最小费用流的更多相关文章

  1. POJ2195 最小费用流

    题目:http://poj.org/problem?id=2195 处理出每个人到每个门的曼哈顿距离,分别建立容量为1费用为曼哈顿距离的边,在源点和每个人人之间建立容量为1费用为0的边,在门和汇点之间 ...

  2. HDU 4067 hdoj 4067 Random Maze 最小费用流

    给出n个点,m条边,入口s和出口t,对于每条边有两个值a,b,如果保留这条边需要花费:否则,移除这条边需要花费b. 题目要求用最小费用构造一个有向图满足以下条件: 1.只有一个入口和出口 2.所有路都 ...

  3. POJ 2516:Minimum Cost(最小费用流)

    https://vjudge.net/problem/11079/origin 题意:有N个商店和M个供应商和K种物品,每个商店每种物品有一个需求数,每个供应商每种物品有一个供应量,供应商到商店之间的 ...

  4. POJ-2175 Evacuation Plan 最小费用流、负环判定

    题意:给定一个最小费用流的模型,根据给定的数据判定是否为最优解,如果不为最优解则给出一个比给定更优的解即可.不需要得出最优解. 解法:由给定的数据能够得出一个残图,且这个图满足了最大流的性质,判定一个 ...

  5. Going Home (hdu 1533 最小费用流)

    集训的图论都快结束了,我才看懂了最小费用流,惭愧啊. = = 但是今天机械键盘到了,有弄好了自行车,好高兴\(^o^)/~ 其实也不是看懂,就会套个模板而已.... 这题最重要的就是一个: 多组输入一 ...

  6. POJ 2195 Going Home 最小费用流 裸题

    给出一个n*m的图,其中m是人,H是房子,.是空地,满足人的个数等于房子数. 现在让每个人都选择一个房子住,每个人只能住一间,每一间只能住一个人. 每个人可以向4个方向移动,每移动一步需要1$,问所有 ...

  7. [haoi2010]订货 最小费用流

    这道题oj上的标签是动态规划,但我想不出来动态规划怎么搞,空间不爆,时间也要爆的: 好的,不扯淡,此题正常做法是最小费用流: 这道题我写了两遍,为什么呢?原因是第一次写的时候,不会写费用流,又恰好没带 ...

  8. FZU2143Board Game(最小费用流)

    题目大意是说有一个B矩阵,现在A是一个空矩阵(每个元素都为0),每次操作可以将A矩阵相邻的两个元素同时+1,但是有个要求就是A矩阵的每个元素都不可以超过K,求 这个的最小值 解题思路是这样的,新建起点 ...

  9. POJ 2516 Minimum Cost 最小费用流

    题目: 给出n*kk的矩阵,格子a[i][k]表示第i个客户需要第k种货物a[i][k]单位. 给出m*kk的矩阵,格子b[j][k]表示第j个供应商可以提供第k种货物b[j][k]单位. 再给出k个 ...

随机推荐

  1. Selenium-java-XML启动用例类-简单1

    最简单启动用例方法 1 先建立xml xml代码如下 <?xml version="1.0" encoding="UTF-8"?> <suit ...

  2. mysql timeout知多少

    1.timeout变量知多少 打开mysql,用show variables like '%timeout%'命令一看,不看不知道,一看吓一跳,结果如下面所示,这么多timeout相关变量,一下就吓尿 ...

  3. fail树

    前置技能:AC自动机 假设我们有了一个AC自动机,然后在上面进行字符串匹配. 上面是一个有四个字符串的AC自动机(abcde.aacdf.cdf.cde),虚线是fail指针,实线是转移. 这是上一次 ...

  4. [LeetCode] Android Unlock Patterns 安卓解锁模式

    Given an Android 3x3 key lock screen and two integers m and n, where 1 ≤ m ≤ n ≤ 9, count the total ...

  5. 【6年开源路】FineUI家族今日全部更新(FineUI + FineUI3to4 + FineUI.Design + AppBox)!

    刚才询问博客园团队: [6年开源路]三石今日送福利,AppBox4.0源码免费拿!FineUI家族今日全部更新(FineUI + FineUI3to4 + FineUI.Design + AppBox ...

  6. 一个简单的ASP.NET MVC异常处理模块

    一.前言 异常处理是每个系统必不可少的一个重要部分,它可以让我们的程序在发生错误时友好地提示.记录错误信息,更重要的是不破坏正常的数据和影响系统运行.异常处理应该是一个横切点,所谓横切点就是各个部分都 ...

  7. 如何在Microsoft Edge浏览器中添加一个Hello World插件

    注:本文提到的代码示例下载地址> How to add a Hello World extension to Microsoft Edge Microsoft Edge 随着Win 10一起推出 ...

  8. FPGA与simulink联合实时环路系列——实验三 按键key

    实验三 按键key 实验内容 在FPGA的实验中,经常涉及到按键的使用,按键是必不可少的人机交互的器件之一,在这些实验中,有时将按键的键值读取显示到数码管.LCD或者是通过串口传送到PC的串口助手上进 ...

  9. python基础-生成随机字符串方法

    python解释器示例 >>> import uuid >>> uuid.uuid1() UUID('ae6822e6-c976-11e6-82e0-0090f5f ...

  10. 上传和设置Mime类型

    这两天一直在忙把主页上传的事,幸亏不久前花七块钱买了一年的数据库和虚拟主机,昨天上传了自己的个人主页,发现很多问题要改,因为代码一直没整理就那么放着了,大部分东西都要重新弄,然后把本地数据库的数据迁移 ...