第一道拆邊題 用bellman-ford以967ms險過...
先說一下大體的題意:輸入n m k 分別指城市的個數 m條邊 現在需要把k個單位的物品從城市1運往城市n
接下來的m行 每一行輸入四個數 u
i, v
i, a
i, ci
代表從城市u到城市v有一條單向路 容量為c 如果在這條路上運送x個單位的物品 需要花費a*x*x的費用
求最小費用 若不能成功將這k個物品運輸到城市n 輸出-1
思路:拆邊 m條邊 對於每一條邊 每條邊都可以分成c條邊
這c條邊 容量都為1 花費為 1a 3a 5a 7a 最多到9a(因為c最大是5)
如果流量為1 就會走第一條邊 花費a*1*1的費用
如果流量為2 就會走第一條和第二條邊 花費為1a+3a == a*2*2
同理依次類推
#include#include#include#include#include#include#include#include#include#include#include#include#includetypedef long long ll;
using namespace std;
#define mv 11000 //max number of node
#define inf 0x3f3f3f3f
struct edge;};
vector g[mv];
int dis[mv];//the distance from source
int prevv[mv], preve[mv];//the previous node and the previous edge
int min_cost_flow(int v,int s, int t, int f)}}
}if(dis[t] == inf)
return -1;
int d = f;
for(i = t; i != s; i = prevv[i])
d = min(d, g[prevv[i]][preve[i]].cap);
ans += d * dis[t];
f -= d;
for(i = t; i != s; i = prevv[i])
}return ans;
}void addedge(int s1,int t1,int cap,int cost)
int main()
{
int n,m,k;
int i;
while(scanf("%d%d%d",&n,&m,&k)==3)
{for(i=0;i
hdu 3667(拆邊 最小費用最大流)
思路 由於花費的計算方法是a x x,因此必須拆邊,使得最小費用流模板可用,即變成a x的形式。具體的拆邊方法為 第i次取這條路時費用為 2 i 1 a i 5 每條邊的容量為1。如果這條邊通過的流量為x,那正好sigma 2 i 1 1 1 include2 include3 include4 i...
最小費用最大流 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,...