POJ2135 Farm Tour(最小费用最大流裸题)

来源:互联网 发布:淘宝客批量申请定向 编辑:程序博客网 时间:2024/06/05 01:18
Source Code#include<queue>#include<cstdio>#include<string>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int MAXN = 100000;const int MAXM = 100000;const int INF = 1999999999;struct Edge{ int to,next,cap,flow,cost;}edge[MAXM];int head[MAXN],tol;int pre[MAXN],dis[MAXN];bool vis[MAXN];int N;//节点总个数,节点编号从0~N-1void init(int n){ N = n; tol = 0; memset(head,-1,sizeof(head));}void addedge(int u,int v,int cap,int cost){ edge[tol].to = v; edge[tol].cap = cap; edge[tol].cost = cost; edge[tol].flow = 0; edge[tol].next = head[u]; head[u] = tol++; edge[tol].to = u; edge[tol].cap = 0; edge[tol].cost = -cost; edge[tol].flow = 0; edge[tol].next = head[v]; head[v] = tol++;}bool spfa(int s,int t){ queue<int>q; for(int i = 0;i <= N;i++) { dis[i] = INF; vis[i] = false; pre[i] = -1; } dis[s] = 0; vis[s] = true; q.push(s); while(!q.empty()) { //cout<<1<<endl; int u = q.front(); q.pop(); vis[u] = false; for(int i = head[u]; i != -1;i = edge[i].next) { int v = edge[i].to; if(edge[i].cap > edge[i].flow && dis[v] > dis[u] + edge[i].cost ) { dis[v] = dis[u] + edge[i].cost; pre[v] = i; if(!vis[v]) { vis[v] = true; q.push(v); } } } } if(pre[t] == -1)return false; else return true;}//返回的是最大流,cost存的是最小费用int minCostMaxflow(int s,int t,int &cost){ int flow = 0; cost = 0; while(spfa(s,t)) { //cout<<1<<endl; int Min = INF; for(int i = pre[t];i != -1;i = pre[edge[i^1].to]) { if(Min > edge[i].cap - edge[i].flow) Min = edge[i].cap - edge[i].flow; } for(int i = pre[t];i != -1;i = pre[edge[i^1].to]) { edge[i].flow += Min; edge[i^1].flow -= Min; cost += edge[i].cost * Min; } flow += Min; } return flow;}int main(){int n,m;while(cin>>n>>m){init(n+1);int u,v,w,s,t;while(m--){cin>>u>>v>>w;addedge(u,v,1,w);addedge(v,u,1,w);}addedge(0,1,2,0);addedge(n,n+1,2,0);int cost;int ans=minCostMaxflow(0,n+1,cost);cout<<cost<<endl;}}

0 0
原创粉丝点击