最小费用最大流

 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\n",MCMF(0,n+1));

97     }

98     return 0;

99 }
View Code

 

你可能感兴趣的:(最大流)