hdu 4411 最小费用流
思路:主要就是要把一个每个城市拆为两个点,建一条容量为1,费用为-inf的边,保证每个城市都会被遍历。
/*最小费用最大流*/
#include<iostream>
#include<cstring>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
const int Maxn = ;
const int inf = ;
struct Edge{
int v;
int val;
int cost;
int next;
}edge[Maxn*];
int head[Maxn],n,g[Maxn][Maxn],m,k;
int e;
int pre[Maxn], pos[Maxn];
int dis[Maxn], que[Maxn*];
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 = ;
edge[e].cost = -cost;
edge[e].next = head[v];
head[v] = e++;
}
void init()
{
memset(head,-,sizeof(head));
for(int i=;i<Maxn;i++)
for(int j=;j<Maxn;j++)
g[i][j]=inf;
e=;
}
bool spfa(int s, int t)
{
int i;
memset(pre, -, sizeof(pre));
memset(vis, , sizeof(vis));
int Head, tail;
Head = tail = ;
for(i = ; i < Maxn; i++)
dis[i] = inf;
que[tail++] = s;
pre[s] = s;
dis[s] = ;
vis[s] = ;
while(Head != tail)
{
int now = que[Head++];
vis[now] = ;
for(i=head[now]; i != -; 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 > && 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] = ;
que[tail++] = adj;
}
}
}
}
return pre[t] != -;
}
int MinCostFlow(int s, int t, int flow)
{
int i;
int cost = ;
flow = ;
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] ^ ].val += f;
}
// cout<<cost<<endl;
}
return cost;
// flow是最大流值
}
void floyd()
{
int i,j,k;
for(k=;k<=n;k++)
for(i=;i<=n;i++)
for(j=;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,-,sizeof(head));
e=;
int ss = ;
int s = *n+;
int t = *n+;
add(s,ss,lim,);
for(int i=;i<=n;i++)
{
if(g[][i] < inf)
{
add(ss,i,,g[][i]);
add(i+n,t,,g[i][]);
}
add(i,i+n,,-inf);
for(int j=i+;j<=n;j++)
{
if(g[i][j] < inf)
{
add(i+n,j,,g[i][j]);
}
}
}
add(ss,t,k,);
return;
}
int solve()
{
int i,j;
int ans;
ans=inf;
build(k);
ans=min(ans,MinCostFlow(n+n+,n+n+,)+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=;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 ;
}
hdu 4411 最小费用流的更多相关文章
- hdu 4411 arrest 最小费用流
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> #i ...
- hdu 4411 2012杭州赛区网络赛 最小费用最大流 ***
题意: 有 n+1 个城市编号 0..n,有 m 条无向边,在 0 城市有个警察总部,最多可以派出 k 个逮捕队伍,在1..n 每个城市有一个犯罪团伙, 每个逮捕队伍在每个城市可以选 ...
- 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 6188最小费用流
题目链接:http://hdu.hustoj.com/showproblem.php?pid=6118 掉坑里了,图很好建,Wa了一发,看了Disscuss里面有人提供了一组样例,画图发现:最小流模板 ...
- hdu 4744 最小费用流
#include <cstdio> #include <queue> #include <cstring> #include <cmath> #defi ...
- hdu 4494 最小费用流
思路:这题我在下午重现的时候就用的费用流做,可是各种悲催的超时,只是我一开始的那种建图方式多了一个二分查找. 戏剧性的是,求距离的返回值写成int型了,CodeBlock编译器又没有警告,然后就WA啊 ...
- HDU 4411 Arrest
http://www.cnblogs.com/jianglangcaijin/archive/2012/09/24/2700509.html 思路: S->0 流量为K费用0 0->i 流 ...
- [GodLove]Wine93 Tarining Round #7
比赛链接: http://vjudge.net/contest/view.action?cid=47643#overview 比赛来源: 2012 ACM/ICPC Asia Regional Han ...
随机推荐
- win8下hosts保存文档失败,提示:请检查文件是否被另一个应用程序打开
选择文件,然后右键点击属性,然后进入"安全"选项卡下点击当前用户对用的用户名然后编辑权限,给予完全控制的权限. 如图: 图一:
- flash 定义主舞台窗口大小
1:[SWF(width=100 height=100)] 写在主类上面2:设置stageScaleMode属性为false;
- windows下安装,配置gcc编译器
在Windows下使用gcc编译器: 1.首先介绍下MinGW MinGW是指仅仅用自由软件来生成纯粹的Win32可运行文件的编译环境,它是Minimalist GNU on Windows的略称. ...
- C++ Code_Slider
主题 1. 滑块控件属性设置 2. 使用滑块控件设置颜色 3. 显示Slider的数值 4. 5. 属性 滑块控件属性设置 //代码设置属性 代码:: ////////////// ...
- 有用好看的CSS+JS+table 导航
预览效果图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dis ...
- Beautyacticle
Original: https://github.com/rizhilee/Beautyacticle Backup: https://github.com/eltld/Beautyacticle
- Android游戏框架之基础之AA碰撞系统
AA 碰撞体 就是将所有的物体设置为矩形框进行碰撞计算.下面是代码 /* * Copyright (C) 2010 The Android Open Source Project * * Licens ...
- 终端I/O之行控制函数
下列4个函数提供了终端设备的行控制能力.其中,filedes引用一个终端设备,否则出错返回,errno设置为ENOTTY. #include <termios.h> int tcdrain ...
- QThread与QWidget使用
本文主要内容: 在任务一中,用 四 种方式实现:点击界面按钮,开线程运行一段程序,结果显示在一个Label上.1. 用不正确的方式得到看似正确的结果2. 用Qt Manual 和 例子中使用的方法3. ...
- php与mysql的链接到底用mysql 还是mysqli,pdo
参考:http://php.net/manual/en/mysqlinfo.api.choosing.php