最小费用最大流改动下,将本来的正边改成负边 就成了 最大费用最大流。
然后构图,自己慢慢构。
拆点,建立流量为1 费用为权值的边。
#include#include #include #include #include using namespace std; const int maxn=2000,maxm=100000,inf=100000000; struct Edge { Edge(){}; Edge(int a,int b,int c,int d){v=a;f=b;w=c;nxt=d;} int v,f,w,nxt; }; int Map[30][30]; int src,sink; struct Edge e[maxm+10]; int g[maxn+10]; int nume; queue que; int dist[maxn+10]; int prev[maxn+10],pree[maxn+10]; bool inQue[maxn+10]; void add(int u,int v,int f,int w) { e[++nume]=Edge(v,f,-w,g[u]); g[u]=nume; e[++nume]=Edge(u,0,w,g[v]); g[v]=nume; } bool findPath() { while(!que.empty()) que.pop(); que.push(src); int i; for(i=1;i<=sink;i++) dist[i]=inf; dist[src]=0; memset(inQue,false,sizeof(inQue)); inQue[src]=true; while(!que.empty()){ int u=que.front(); que.pop(); for(i=g[u] ; i ;i=e[i].nxt){ if(e[i].f>0&&dist[u]+e[i].w