更新下:换了zkw费用流,过掉了所有数据。代码最下面,代码很丑就是了。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
费用流:把每个城市按7天拆成7个点,边就很好连了。(类似猪圈那题)。
只拿到【90分】,估计是我的费用流模板太差了。
据说有个zkw费用流很快,什么时候换下。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<iostream>
using namespace std;
struct EDGE{
int from,to,flow,cap,cost;
EDGE(int u=0,int v=0,int cp=0,int cst=0){from=u;to=v;flow=0;cap=cp;cost=cst;}
};
/*
用法:(1) clearMap
(2) addEdge 节点个数由addEdge自动计算
(3) solve(s,t,&flow,&cost) 计算s->t的最小费用最大流,费用保存在cost中,流保留在flow中
*/
class MCMF{ //对费用流进行类似ISAP的优化
#define MCMFINF 0x7fff0000
#define MCMFN 1010
private:
int s,t;
int n; //n在添加边时自动维护,节点下标范围[0..n]
int p[MCMFN];
int d[MCMFN];
bool inq[MCMFN];
vector<EDGE> e;
vector<int> g[MCMFN];
bool spfa(int &flow,int &cost); //是否能找到一条增广路
int augument(int &flow,int& cost); //对p中的路径进行增广,流量和费用加在flow和cost中
public:
int clearMap();
int addEdge(int u,int v,int cap,int cost); //添加一条单向边
int solve(int s,int t,int& flow,int&cost); //求解s->t的费用流
};
int MCMF::clearMap(){
n=0;
e.clear();
for (int i=0;i<MCMFN;i++)g[i].clear();
return 0;
}
int MCMF::addEdge(int u,int v,int cap,int cost){
if (cap==0) return