HDU 3667

http://acm.hdu.edu.cn/showproblem.php?pid=3667

最小费用最大流

本题流量和费用不是线性关系,fee=a*flow*flow,所以常规套模板spfa无法得到最小费用

观察到每条边流量上限只有5,则可以把一条流量为f的边拆成f条流量为1的边,每条边费用是a*(2*i-1)(1<=i<=f)

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std ;
const int INF=0xfffffff ;
struct node{
int s,t,cap,cost,nxt ;
}e[200005] ;
int sumflow ;
int n,m,k,cnt,head[1005],vis[1005],dis[1005],pre[1005] ;
void add(int s,int t,int cap,int cost)
{
e[cnt].s=s ;e[cnt].t=t ;e[cnt].cap=cap ;e[cnt].cost=cost ;e[cnt].nxt=head[s] ;head[s]=cnt++ ;
e[cnt].s=t ;e[cnt].t=s ;e[cnt].cap=0 ;e[cnt].cost=-cost ;e[cnt].nxt=head[t] ;head[t]=cnt++ ;
}
int spfa(int s,int t,int N)
{
for(int i=0 ;i<=N ;i++)
dis[i]=INF ;
dis[s]=0 ;
memset(vis,0,sizeof(vis)) ;
memset(pre,-1,sizeof(pre)) ;
vis[s]=1 ;
queue <int> q ;
q.push(s) ;
while(!q.empty())
{
int u=q.front() ;
q.pop() ;
vis[u]=0 ;
for(int i=head[u] ;i!=-1 ;i=e[i].nxt)
{
int tt=e[i].t ;
if(e[i].cap && dis[tt]>dis[u]+e[i].cost)
{
dis[tt]=dis[u]+e[i].cost ;
pre[tt]=i ;
if(!vis[tt])
{
vis[tt]=1 ;
q.push(tt) ;
}
}
}
}
if(dis[t]==INF)return 0 ;
return 1 ;
}
int MCMF(int s,int t,int N)
{
int flow,minflow,mincost ;
mincost=flow=0 ;
while(spfa(s,t,N))
{
minflow=INF ;
for(int i=pre[t] ;i!=-1 ;i=pre[e[i].s])
minflow=min(minflow,e[i].cap) ;
flow+=minflow ;
for(int i=pre[t] ;i!=-1 ;i=pre[e[i].s])
{
e[i].cap-=minflow ;
e[i^1].cap+=minflow ;
}
mincost+=dis[t]*minflow ;
}
sumflow=flow ;//最大流
if(sumflow<k)return -1 ;
return mincost ;
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&k))
{
cnt=0 ;
memset(head,-1,sizeof(head)) ;
while(m--)
{
int u,v,a,c ;
scanf("%d%d%d%d",&u,&v,&a,&c) ;
for(int i=1 ;i<=c ;i++)
add(u,v,1,a*(2*i-1)) ;//Σa*(2*i-1)=a*c*c
}
add(0,1,k,0) ;
printf("%d\n",MCMF(0,n,n+1)) ;
}
return 0 ;
}

时间: 2024-10-12 07:40:42

HDU 3667的相关文章

HDU 3667 Transportation(网络流之费用流)

题目地址:HDU 3667 这题的建图真是巧妙...为了保证流量正好达到k,需要让每一次增广到的流量都是1,这就需要把每一条边的流量都是1才行.但是每条边的流量并不是1,该怎么办呢.这个时候可以拆边,反正c最多只有5,拆成5条流量为1的边.但是这时候费用怎么办呢,毕竟平方的关系不能简单把每一条边加起来.这时候可以把拆的边的流量设为1,3,5,7,9.如果经过了3个流量,那就肯定会流1,3,5,费用为9,是3的平方,同理,其他的也是如此.然后按照给出的边建图跑一次费用流就可以了. 代码如下: #i

Hdu 3667 Transportation(最小费用流+思路)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3667 思路:平方关系,直接建图每次增广并不是最优.... 1^2=1,2^2=1+3,3^2=1+3+5,4^2=1+3+5+7....... 所以,对于每条边<x,y>,若流量为c,则在x与y之间连c条边,流量均为1,费用分别为a[i],3*a[i],5*a[i].........由于每次增广时流量相同时选择最小花费的边,若该边<x,y>流量为c,则总花费为a[x]+3*a[x]+5

hdu 3667(最小费用最大流+拆边)

Transportation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2670    Accepted Submission(s): 1157 Problem Description There are N cities, and M directed roads connecting them. Now you want to

hdu 3667 拆边加最小费用流

Transportation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2301    Accepted Submission(s): 966 Problem Description There are N cities, and M directed roads connecting them. Now you want to t

hdu 3667 /2010哈尔滨赛区H题 费用与流量为非线性关系/费用流

题意: 在一般费用流题目改动:路过某路,每x单位流量须要花费 ai*x^2(ai为给定的系数). 開始的的时候,一看仅仅只是是最后统计费用上在改动罢了,一看例子.发现根本没那么简单(ps:以后每次写程序前先看例子能不能过.),由于是成平方关系.每次一流量增广的话.下次未必最优!于是想到我每次仅仅增长一个单位流量.每次增长一个单位之后,该路径上的全部边的费用边改为i^2-(i-1)^2,(第一次肯定增广a,其次的话3a.5a.7a....由于第一次已经增广了,和为第i次i平方就可以! )如此.符合

HDU 3667 费用流(拆边)

题意:有n个城市(1~n),m条有向边:有k件货物要从1运到n,每条边最多能运c件货物,每条边有一个危险系数ai,经过这条路的费用需要ai*x2(x为货物的数量),问所有货物安全到达的费用. 思路:c<=5,这里可以做文章:把每条边拆成c条边,容量都为1,费用为ai*(2*i-1)(第二个i是指拆边时的第几条边).推导:x2-(x-1)2=2x-1. 代码: 1 #include<stdio.h> 2 #include<string.h> 3 #define min(x,y)

HDU 3667 费用流 拆边 Transportation

题意: 有N个城市,M条有向道路,要从1号城市运送K个货物到N号城市. 每条有向道路<u, v>运送费用和运送量的平方成正比,系数为ai 而且每条路最多运送Ci个货物,求最小费用. 分析: 拆边,每条边拆成费用为a, 3a, 5a的边,这样就能保证每条边的费用和流量的平方成正比. 因为最多运送K个货物,所以增加一个源点和城市1连一条容量为K费用为0的边. 跑一边最小费用最大流,如果满流才有解. 1 #include <iostream> 2 #include <cstdio&

图论 500题——主要为hdu/poj/zoj

转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并查集======================================[HDU]1213   How Many Tables   基础并查集★1272   小希的迷宫   基础并查集★1325&&poj1308  Is It A Tree?   基础并查集★1856   More i

hdu图论题目分类

=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many Tables 基础并查集★ 1272 小希的迷宫 基础并查集★ 1325&&poj1308 Is It A Tree? 基础并查集★ 1856 More is better 基础并查集★ 1102 Constructing Roads 基础最小生成树★ 1232 畅通工程 基础并查集★ 123