HDU 4067 hdoj 4067 Random Maze 最小费用流
给出n个点,m条边,入口s和出口t,对于每条边有两个值a,b,如果保留这条边需要花费;否则,移除这条边需要花费b。
题目要求用最小费用构造一个有向图满足以下条件:
1.只有一个入口和出口
2.所有路都是唯一方向
3.对于入口s,它的出度 = 它的入度 + 1
4.对于出口t,它的入度 = 它的出度 + 1
5.除了s和t外,其他点的入度 = 其出度
最后如果可以构造,输出最小费用;否则输出impossibe。
题解:
对于所有的边(u,v,a,b)我们先进行保留。
因为题目要求3和4.我们虚拟添加一条边从t到s in[s]++;out[t]++.
然后得到一个图,这个图必须经过修改使得所有点出度=入度。
和hdu3488有点类似,但是那题是在有给定明确的出度入度的时候才能拆点跑费用流。
于是注意到Σin[i]=Σout[i],所以得出Σin[i]-out[i] (i|{in{i]>out[i]}=Σout[j]-in[j] (i|{out{j]>in[j]})
因此将所有的点集合分为两个集合, 一部分是(i|{in{i]>out[i]}一部分是(j|{out{j]>in[j]})
于是对于每个点i, 如果in[i] > out[i] . 建边S->i, 权值为0, 流量为in[i] – out[i];
否则的话 建边 i->T ,权值为0, 流量为out[i] – in[i];
然后因为我们要使他们的in[i]-out[i]为0,因此只需要通过将原来的边删除,减少出度和入度即可。
跑一遍最小费用流即可。但是因为负权边会使spfa的效率降低,因此建边时略有不同,所以采用了第二种建边方式。看代码即可。
傻逼博客园代码看起来好搓
const int maxn=262144,INF=999999999;
int next[maxn],last[maxn],tot,e[maxn],op[maxn],cost[maxn],c[2010][2010],b[2010],a[2010],dist[maxn],inq[maxn],from[maxn];
int val[maxn],S,n,m,T,q[100*maxn],ans,u[maxn],in[maxn],out[maxn],total;
void add(int x,int y,int v,int c)
{
next[++tot]=last[x];last[x]=tot;val[tot]=v;e[tot]=y;op[tot]=tot+1;cost[tot]=c;u[tot]=x;
next[++tot]=last[y];last[y]=tot;e[tot]=x;op[tot]=tot-1;val[tot]=0;cost[tot]=-c;u[tot]=y;
}
int spfa()
{
for (int i=S;i<=T;i++)dist[i]=INF;
dist[S]=0;
int h=0,t=0;
q[++t]=S;inq[S]=0;
while (h<t)
{
int x=q[++h];
for (int i=last[x];i;i=next[i])
{
int v=e[i];
if (val[i]&&dist[v]>dist[x]+cost[i])
{
from[v]=i;
dist[v]=dist[x]+cost[i];
if (!inq[v])inq[v]=1,q[++t]=v;
}
}
inq[x]=0;
}
if(dist[T]==INF)return 0;return 1;
}
void mcf()
{
int x=INF,i=T;
for (int i=from[T];i;i=from[u[i]])
x=std::min(x,val[i]);
for (int i=from[T];i;i=from[u[i]])
{
val[i]-=x;
val[op[i]]+=x;
ans+=x*cost[i];
}
total=total-x;
}
int main()
{
int u,v,a,b,sum,cases,s,t;
scanf("%d",&cases);
for (int j=1;j<=cases;j++)
{
scanf("%d%d%d%d",&n,&m,&s,&t);
tot=sum=0;
std::memset(last,0,sizeof(last));
std::memset(in,0,sizeof(in));
std::memset(out,0,sizeof(out));
for (int i=1;i<=m;i++)
{
scanf("%d%d%d%d",&u,&v,&a,&b);
if (a<b)
{
out[u]++;in[v]++;
add(v,u,1,b-a);
} else add(u,v,1,a-b);
sum+=std::min(a,b);
}
in[s]++;out[t]++;
S=0;T=n+1;total=0;
for (int i=1;i<=n;i++)
if (in[i]>out[i])
add(S,i,in[i]-out[i],0),total+=in[i]-out[i];
else
if (in[i]<out[i])add(i,T,out[i]-in[i],0);
ans=0;
while(spfa())
mcf();
printf("Case %d: ",j);
if (!total)printf("%d\n",ans+sum);
else printf("impossible\n");
}
return 0;
}
HDU 4067 hdoj 4067 Random Maze 最小费用流的更多相关文章
- Random Maze HDU - 4067(预定义状态建边(贪心建边))
Random Maze Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- HDU 4067 Random Maze
意甲冠军: 一个"随机图"它被定义为具有以下性质如: 一个入口和一个出口 有向图 对于入口 出度比入度大1 对于出口 入度比出度大1 对于其它点 入度等于出度 现给出一幅有向 ...
- HDU 1853Cyclic Tour(网络流之最小费用流)
题目地址:pid=1853">HDU1853 费用流果然好奇妙. .还能够用来推断环...假设每一个点都是环的一部分并且每一个点仅仅能用到一次的话,那每一个点的初度入度都是1,这就能够 ...
- HDU 4746 HDOJ Mophues 2013杭州网赛I题
比赛的时候就预感到这题能出,但是会耗时比较多.结果最后是出了,但是有更简单的题没出. 是不是错误的决策呢?谁知道呢 题目意思: 定义f(x) = x分解质因数出来的因子个数 如 x = p0 * p0 ...
- HDU 4790:Just Random(容斥)
Just Random Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- HDU4067 Random Maze(最小费用最大流)
题目大概说,给一张图,删除其中一些单向边,使起点s出度比入度多1,终点t入度比出度多1,其他点出度等于入度.其中删除边的费用是bi,保留边的费用是ai,问完成要求最小的费用是多少. 一开始我想到和混合 ...
- HDU 4910 HDOJ Problem about GCD BestCoder #3 第四题
首先 m = 1 时 ans = 0对于 m > 1 的 情况 由于 1 到 m-1 中所有和m互质的数字,在 对m的乘法取模 运算上形成了群 ai = ( 1<=a<m & ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- hdu图论题目分类
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
随机推荐
- 读《编写可维护的JavaScript》第二三章总结
第二章 注释 添加注释的一般原则是,在需要让代码变得清晰时添加注释. 2.1 ① 单行注释 独占一行的注释,用来解释下一行代码.这行注释之前总是有一个空行,且缩进层级和下一行代码保持一致. 在代码行的 ...
- BW系统之间的InfoProvider数据传输:Export DataSource
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- DSO的记录模式Record Mode字段测试
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- iOS 圆的放大动画效果
第一步:创建一个View,将这个View添加到当前的控制器 如: CGFloat timeW = self.view.bounds.size.width; timeAnimation * timean ...
- Android微信智能心跳方案 (转)
原创 2015-08-17 phoenix WeMobileDev 前言:在13年11月中旬时,因为基础组件组人手紧张,Leo安排我和春哥去广州轮岗支援.刚到广州的时候,Ray让我和春哥对Line和W ...
- spring-boot 之 使用Admin监控应用
https://yq.aliyun.com/articles/2322 ************************************* 摘要: Spring Boot提供的监控接口,例如: ...
- 萝卜招聘网 http://www.it9s.com 可以发布免费下载简历求职 ,免费!免费!全部免费!找工作看过来 免费下载简历 !
萝卜招聘网 http://www.it9s.com 可以发布免费下载简历求职 ,免费!免费!全部免费!找工作看过来 免费下载简历 !萝卜招聘网 http://www.it9s.com 可以发布 ...
- AJAX总结
艾瑞宝迪,早上好,前端小菜鸟最近想更深入的了解ajax,无奈网上都没有看到合适系统的总结,于是心血来潮开始自己在博客园上的处女作,方便自己以后查看,也可以和大家一起交流
- 前台jquery+ajax+json传值,后台处理完后返回json字符串,如何取里面的属性值?(不用springmvc注解)
一.取属性值 前台页面: function select(id){ alert("hfdfhdfh"+id); $.ajax({ url:"selectByid.jsp& ...
- JAVA06数组之动手动脑问题解决
一.随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中. 1.设计思路:首先生成10个随机数,然后存放至长度至少是10的数组中,然后计算10个随机 ...