思路:主要就是要把一个每个城市拆为两个点,建一条容量为1,费用为-inf的边,保证每个城市都会被遍历。

/*最小费用最大流*/
#include<iostream>
#include<cstring>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
const int Maxn = 1010;
const int inf = 1000010;
struct Edge{int v;int val;int cost;int next;
}edge[Maxn*100];
int head[Maxn],n,g[Maxn][Maxn],m,k;
int e;
int pre[Maxn], pos[Maxn];
int dis[Maxn], que[Maxn*100];
bool vis[Maxn];
void add(int u, int v, int val, int cost)
{edge[e].v = v;edge[e].val = val;edge[e].cost = cost;edge[e].next = head[u];head[u] = e++;edge[e].v = u;edge[e].val = 0;edge[e].cost = -cost;edge[e].next = head[v];head[v] = e++;
}
void init()
{memset(head,-1,sizeof(head));for(int i=0;i<Maxn;i++)for(int j=0;j<Maxn;j++)g[i][j]=inf;e=0;
}
bool spfa(int s, int t)
{int i;memset(pre, -1, sizeof(pre));memset(vis, 0, sizeof(vis));int Head, tail;Head = tail = 0;for(i = 0; i < Maxn; i++)dis[i] = inf;que[tail++] = s;pre[s] = s;dis[s] = 0;vis[s] = 1;while(Head != tail){int now = que[Head++];vis[now] = 0;for(i=head[now]; i != -1; i = edge[i].next){int adj = edge[i].v;//cout<<now<<" "<<adj<<" "<<dis[now]<<" "<<edge[i].cost<<" "<<dis[adj]<<" "<<edge[i].val<<endl;if(edge[i].val > 0 && dis[now] + edge[i].cost < dis[adj]){dis[adj] = dis[now] + edge[i].cost;pre[adj] = now;pos[adj] = i;if(!vis[adj]){vis[adj] = 1;que[tail++] = adj;}}}}return pre[t] != -1;
}
int MinCostFlow(int s, int t, int flow)
{int i;int cost = 0;flow = 0;while(spfa(s, t)){int f = inf;for(i = t; i != s; i = pre[i])if (edge[pos[i]].val < f)f = edge[pos[i]].val;flow += f;cost += dis[t] * f;for(i = t; i != s; i = pre[i]){edge[pos[i]].val -= f;edge[pos[i] ^ 1].val += f;}// cout<<cost<<endl;
    }return cost;// flow是最大流值
}
void floyd()
{int i,j,k;for(k=0;k<=n;k++)for(i=0;i<=n;i++)for(j=0;j<=n;j++){if(g[k][j]==inf) continue;g[i][j]=min(g[i][j],g[i][k]+g[k][j]);}
}
void build(int lim)
{memset(head,-1,sizeof(head));e=0;int ss = 0;int s = 2*n+1;int t = 2*n+2;add(s,ss,lim,0);for(int i=1;i<=n;i++){if(g[0][i] < inf){add(ss,i,1,g[0][i]);add(i+n,t,1,g[i][0]);}add(i,i+n,1,-inf);for(int j=i+1;j<=n;j++){if(g[i][j] < inf){add(i+n,j,1,g[i][j]);}}}add(ss,t,k,0);return;
}
int solve()
{int i,j;int ans;ans=inf;build(k);ans=min(ans,MinCostFlow(n+n+1,n+n+2,0)+n*inf);return ans;
}
int main()
{int i,j,u,v,c;while(scanf("%d%d%d",&n,&m,&k)!=EOF,n||m||k){init();for(i=1;i<=m;i++){scanf("%d%d%d",&u,&v,&c);if(g[u][v]>c)g[u][v]=g[v][u]=c;}floyd();printf("%d\n",solve());}return 0;
}

转载于:https://www.cnblogs.com/wangfang20/p/3264813.html

hdu 4411 最小费用流相关推荐

  1. HDU 4411最小费用流

    点击打开链接 题意:从0出发,1~N每个城镇有个小偷,我们要把他们全部抓到,我们可以派出k个警察,但是再抓i城镇的小偷之前,i城镇之前的所有城镇的小偷已经被抓了 思路:哪有什么思路,看了网上的题解,为 ...

  2. HDU 4411 Arrest 最小费用流

    题意:有N+1个顶点M条边的无向图.编号为0的顶点是警察厅.编号为1~N的顶点都有犯罪团伙.现在警察厅需要派出K支小队抓住这些犯罪团伙,第i个点的犯罪团伙被抓到之后会马上通知第i-1个犯罪团伙.现要求 ...

  3. hdu 4411 Arrest【最小费用流】

    题目链接 题意: 给定一个有(n+1)个节点的边权图,其中警察局在0点,其他n个点各有一个黑手党,现在警察局派出k个警察去抓黑手党,并逮捕会警察局,一旦黑手党i被抓,他会向黑手党i-1报信,任务就会失 ...

  4. HDU 4411 Arrest(费用流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4411 题意:有n+1个城市,编号0到n.其中警察局在0号城市,1到n号城市中每个城市都有一个小偷.现在 ...

  5. HDU 5988 最小费用流

    链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5988 题意: n个点,每个点有a个人和b包饭,m条边,第一次经过这条边没有问题,以后每一个经 ...

  6. HDU 4411 Arrest 费用流

    题目描述: Description There are (N+1) cities on TAT island. City 0 is where police headquarter located. ...

  7. HDU 4411 Arrest

    http://www.cnblogs.com/jianglangcaijin/archive/2012/09/24/2700509.html 思路: S->0 流量为K费用0 0->i 流 ...

  8. hdu 4411 Arrest 费用流模板

    题意:警察局在0点,里面有k个警察,要将1-n的贼窝一网打尽,这1+n个点都有距离,且要求抓 i 点的贼前保证已经抓光 比i小的贼.警察们最后要回到0点,问满足抓到所以的贼(题目保证可行)最少走的路之 ...

  9. 【HDU】4411 Arrest 费用流

    传送门:[HDU]4411 Arrest 题目分析:题目的意思一开始没看懂= =...题意大致为:派出至多K个警队遵守先灭小的再灭老的的原则将N个城市的帮派全端了(要灭编号大的必须要先灭编号小的).且 ...

最新文章

  1. 通信网络基础期末复习-第一章和第二章-概论和端到端的传输协议
  2. plsql怎么查看存储过程中long变量的值_面试官:详细说下基本数据类型与装箱拆箱的过程...
  3. hssfcolor 不建议使用_不建议使用微信双开的真正原因!
  4. Win11无法使用以太网怎么办 Win11无法连接网络怎么办
  5. 未来集市广告_为什么广告的未来是开放的
  6. 基于JAVA+Swing+MYSQL的停车场管理系统
  7. MySQL · 案例分析 · RDS MySQL线上实例insert慢常见原因分析
  8. 二维随机变量函数卷积公式的推导
  9. Typora免费版,不是破解版,是没有升级的老版本,用的还是比较舒服的
  10. ANSYS_APDL——实例002-模态分析
  11. 拼多多商品按关键词采集爆款商品
  12. 使用 PhyML 构建进化树
  13. 高德地图API 前端调用 搜索定位
  14. MFC应用程序“生死因果”内幕
  15. Unable to determine the relationship represented by navigation ‘XXX‘ of type ‘XXX‘.
  16. 职称计算机ppt教程,职称计算机:Word文档转为PPT的两种方法
  17. 数字图像处理第三章<一>、灰度变换
  18. 160cracked-1
  19. 【BZOJ5020】【THUWC2017】在美妙的数学王国中畅游 LCT 泰勒展开
  20. 为什么功放做得这么复杂?

热门文章

  1. 【哈士奇赠书活动 - 25期】-〖Python自动化办公应用大全(ChatGPT版) 〗
  2. 老板客户让加班重做?除了画圈圈诅咒他们,你还可以这么办…
  3. 云创大数据云存储专利荣获“江苏专利奖优秀奖”
  4. 自动化的签到托管系统搭建教程/可以整合各类平台等加入
  5. LaTex数学公式中常用的符号及标记
  6. 生成一份1500字前端程序员年终总结
  7. 活动 | 即使是AI界“网红” 知识图谱也曾经历40年的生不逢时
  8. DNS服务与邮件服务器
  9. Android下音频tinyalsa(tinymix/tinycap/tinyplay/tinypcminfo)--------mark详细
  10. Catia使用LMT LicManager系统后的效果数据分析