网络流24题之运输问题

其实是水题只不过在noip前一个月时我问整个机房也没人能回答上来。

现在可以随随便便切过去了也是很爽的。

最小费用最大流,按题目要求建图即可。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=250005,inf=1e9;
 4 int d[N],head[N],cnt=-1,n,m,w[105][105],cost,f[N],a[N],b[N],s,t;
 5 bool v[N];
 6 struct node{
 7     int w,to,nex,c,f;
 8 }e[1000005];
 9 void add(int x,int y,int w,int c)
10 {
11     e[++cnt].to=y;e[cnt].nex=head[x];head[x]=cnt;e[cnt].f=x;e[cnt].w=w;e[cnt].c=c;
12     e[++cnt].to=x;e[cnt].nex=head[y];head[y]=cnt;e[cnt].f=y;e[cnt].w=0;e[cnt].c=-c;
13 }
14 queue<int>q;
15 bool spfa()
16 {
17     memset(d,0x3f,sizeof(d));
18     memset(v,0,sizeof(v));
19     memset(f,-1,sizeof(f));
20     v[s]=1;d[s]=0;q.push(s);
21     while(!q.empty())
22     {
23         int x=q.front();q.pop();v[x]=0;
24         for(int i=head[x];i!=-1;i=e[i].nex)
25         {
26             if(!e[i].w||d[e[i].to]<=d[x]+e[i].c)continue;
27             int y=e[i].to;
28             d[y]=d[x]+e[i].c;f[y]=i;
29             if(!v[y])
30             {
31                 q.push(y);v[y]=1;
32             }
33         }
34     }
35     if(d[t]>inf)return 0;
36     int flow=inf;
37     for(int i=f[t];i!=-1;i=f[e[i].f])
38     flow=min(flow,e[i].w);
39     for(int i=f[t];i!=-1;i=f[e[i].f])
40     e[i].w-=flow,e[i^1].w+=flow,cost+=flow*e[i].c;
41     return 1;
42 }
43 int main()
44 {
45     scanf("%d%d",&m,&n);
46     s=0;t=n+m+1;memset(head,-1,sizeof(head));
47     for(int i=1;i<=m;++i)scanf("%d",&a[i]);
48     for(int i=1;i<=n;++i)scanf("%d",&b[i]);
49     for(int i=1;i<=m;++i)
50     {
51         for(int j=1;j<=n;++j)
52         {
53             scanf("%d",&w[i][j]);
54             add(i,j+m,inf,w[i][j]);
55         }
56     }
57     for(int i=1;i<=m;++i)add(s,i,a[i],0);
58     for(int i=1;i<=n;++i)add(i+m,t,b[i],0);
59     while(spfa());
60     printf("%d
",cost);
61     memset(head,-1,sizeof(head));
62     cnt=-1;cost=0;
63     for(int i=1;i<=m;++i)
64     {
65         for(int j=1;j<=n;++j)
66         {
67             add(i,j+m,inf,-w[i][j]);
68         }
69     }
70     for(int i=1;i<=m;++i)add(s,i,a[i],0);
71     for(int i=1;i<=n;++i)add(i+m,t,b[i],0);
72     while(spfa());
73     printf("%d
",-cost);
74     return 0;
75 }
原文地址:https://www.cnblogs.com/nbwzyzngyl/p/8413333.html