标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 14730 | Accepted: 5614 |
Description
Input
Output
Sample Input
4 5 1 2 1 2 3 1 3 4 1 1 3 2 2 4 2
Sample Output
6
Source
#include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; const int INF = 999999999; const int N = 2005; const int M = 80005; struct Edge{ int u,v,cap,cost,next; }edge[M]; int head[N],tot,low[N],pre[N]; int total ; bool vis[N]; void addEdge(int u,int v,int cap,int cost,int &k){ edge[k].u=u,edge[k].v=v,edge[k].cap = cap,edge[k].cost = cost,edge[k].next = head[u],head[u] = k++; edge[k].u=v,edge[k].v=u,edge[k].cap = 0,edge[k].cost = -cost,edge[k].next = head[v],head[v] = k++; } void init(){ memset(head,-1,sizeof(head)); tot = 0; } bool spfa(int s,int t,int n){ memset(vis,false,sizeof(vis)); for(int i=0;i<=n;i++){ low[i] = (i==s)?0:INF; pre[i] = -1; } queue<int> q; q.push(s); while(!q.empty()){ int u = q.front(); q.pop(); vis[u] = false; for(int k=head[u];k!=-1;k=edge[k].next){ int v = edge[k].v; if(edge[k].cap>0&&low[v]>low[u]+edge[k].cost){ low[v] = low[u] + edge[k].cost; pre[v] = k; ///v为终点对应的边 if(!vis[v]){ vis[v] = true; q.push(v); } } } } if(pre[t]==-1) return false; return true; } int MCMF(int s,int t,int n){ int mincost = 0,minflow,flow=0; while(spfa(s,t,n)) { minflow=INF+1; for(int i=pre[t];i!=-1;i=pre[edge[i].u]) minflow=min(minflow,edge[i].cap); flow+=minflow; for(int i=pre[t];i!=-1;i=pre[edge[i].u]) { edge[i].cap-=minflow; edge[i^1].cap+=minflow; } mincost+=low[t]*minflow; } total=flow; return mincost; } int n,m; int main(){ while(scanf("%d%d",&n,&m)!=EOF){ init(); int src = 0,des = n+1; for(int i=1;i<=m;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); if(u==v) continue; addEdge(u,v,1,w,tot); addEdge(v,u,1,w,tot); } addEdge(src,1,2,0,tot); addEdge(n,des,2,0,tot); int a = MCMF(src,des,n+2); printf("%d\n",a); } }
标签:
原文地址:http://www.cnblogs.com/liyinggang/p/5728135.html