思路:由於花費的計算方法是a*x*x,因此必須拆邊,使得最小費用流模板可用,即變成a*x的形式。具體的拆邊方法為:第i次取這條路時費用為(2*i-1)*a (i<=5),每條邊的容量為1。如果這條邊通過的流量為x,那正好sigma(2*i-1)(1<
1 #include2 #include3 #include4 #include5 #include6view codeusing
namespace
std;
7#define maxn 222
8#define maxm 22222222
9#define inf 1<<30
1011
struct
edgeedge[maxm];
1415
intn,m,k,ne;
16int
head[maxn];
1718
void insert(int u,int v,int cap,int
cost)
1932
33int
dist[maxn];
34bool
mark[maxn];
35int
cur[maxn],pre[maxn];
36bool spfa(int vs,int
vt)3757}
58}59}
60return dist[vt]
6263
int mincostflow(int vs,int
vt)64
71 flow+=aug;cost+=dist[vt]*aug;
72for(int u=vt;u!=vs;u=pre[u])76}
77if(flow1;78
return
cost;79}
8081
intmain()
8292
}93 insert(0,1,k,0
);94 printf("
%d\n
",mincostflow(0
,n));95}
96return0;
97}9899
100101
hdu3667 最小費用流 拆邊題
第一道拆邊題 用bellman ford以967ms險過.先說一下大體的題意 輸入n m k 分別指城市的個數 m條邊 現在需要把k個單位的物品從城市1運往城市n 接下來的m行 每一行輸入四個數 u i,v i,a i,ci 代表從城市u到城市v有一條單向路 容量為c 如果在這條路上運送x個單位的物...
最小費用最大流 hdu 3667
學了好幾天了,終於生成了模板 一直以來有乙個問題沒有克服,今天終於想明白了,那就是為什麼要加反向流量呢?那是因為如果你在加流量的時候如果加多了,則要溜回去。include include include include includeusing namespace std const int max...
最小費用最大流(拆邊)
題目大概意思是,有n個城市m條邊,要從1城市到n城市運送k的物品,求最少花費,每個邊有乙個係數ai花費的錢是ai 這條邊上運送物資數的平方,比如在係數為3的邊上運送了2的物品,則需要3 2 2的花費 思路 由於每條邊的容量不超過5,所以可以把每一條邊拆成容量條流量為1的邊,他們的花費分別為1 ai,...