zoukankan      html  css  js  c++  java
  • 最小费用最大流

     1 #include <iostream>
     2 #include <string.h>
     3 #include <stdio.h>
     4 #include <algorithm>
     5 #include <queue>
     6 #define V 10100
     7 #define E 1000100
     8 #define inf 99999999
     9 using namespace std;
    10 int vis[V];
    11 int dist[V];
    12 int pre[V];
    13 
    14 struct Edge{
    15     int u,v,c,cost,next;
    16 }edge[E];
    17 int head[V],cnt;
    18 
    19 void init(){
    20     cnt=0;
    21     memset(head,-1,sizeof(head));
    22 }
    23 void addedge(int u,int v,int c,int cost)
    24 {
    25     edge[cnt].u=u;edge[cnt].v=v;edge[cnt].cost=cost;
    26     edge[cnt].c=c;edge[cnt].next=head[u];head[u]=cnt++;
    27 
    28     edge[cnt].u=v;edge[cnt].v=u;edge[cnt].cost=-cost;
    29     edge[cnt].c=0;edge[cnt].next=head[v];head[v]=cnt++;
    30 }
    31 
    32 bool spfa(int begin,int end){
    33     int u,v;
    34     queue<int> q;
    35     for(int i=0;i<=end+2;i++){
    36         pre[i]=-1;
    37         vis[i]=0;
    38         dist[i]=inf;
    39     }
    40     vis[begin]=1;
    41     dist[begin]=0;
    42     q.push(begin);
    43     while(!q.empty()){
    44         u=q.front();
    45         q.pop();
    46         vis[u]=0;
    47         for(int i=head[u];i!=-1;i=edge[i].next){
    48             if(edge[i].c>0){
    49                 v=edge[i].v;
    50                 if(dist[v]>dist[u]+edge[i].cost){
    51                     dist[v]=dist[u]+edge[i].cost;
    52                     pre[v]=i;
    53                     if(!vis[v]){
    54                         vis[v]=true;
    55                         q.push(v);
    56                     }
    57                 }
    58             }
    59         }
    60     }
    61     return dist[end]!=inf;
    62 }
    63 
    64 int MCMF(int begin,int end){
    65     int ans=0,flow;
    66     int flow_sum=0;
    67     while(spfa(begin,end)){
    68         flow=inf;
    69         for(int i=pre[end];i!=-1;i=pre[edge[i].u])
    70             if(edge[i].c<flow)
    71                 flow=edge[i].c;
    72         for(int i=pre[end];i!=-1;i=pre[edge[i].u]){
    73             edge[i].c-=flow;
    74             edge[i^1].c+=flow;
    75         }
    76         ans+=dist[end];
    77         flow_sum += flow;
    78     }
    79     //cout << flow_sum << endl;
    80     return ans;
    81 }
    82 
    83 int main()
    84 {
    85     //freopen("in.txt","r",stdin);
    86     int n,m,a,b,c;
    87     while(scanf("%d%d",&n,&m)!=EOF){
    88         init();
    89         addedge(0,1,2,0);
    90         addedge(n,n+1,2,0);
    91         for(int i=1;i<=m;i++){
    92             scanf("%d%d%d",&a,&b,&c);
    93             addedge(a,b,1,c);
    94             addedge(b,a,1,c);
    95         }
    96         printf("%d
    ",MCMF(0,n+1));
    97     }
    98     return 0;
    99 }
    View Code
  • 相关阅读:
    Leetcode: Word Ladder II
    Leetcode: Triangle
    Leetcode: Best Time to Buy and Sell Stock II
    Leetcode: Best Time to Buy and Sell Stock
    Leetcode: Pascal's Triangle II
    Leetcode: Pascal's Triangle
    Leetcode: Path Sum II
    Leetcode: Convert Sorted Array to Binary Search Tree
    Leetcode: Merge Sorted Array
    Leetcode: Word Search
  • 原文地址:https://www.cnblogs.com/macinchang/p/4507136.html
Copyright © 2011-2022 走看看