[bzoj1070]修车
虽然知道是费用流。。然而依旧不会做。。Orz
http://hzwer.com/2877.html Orzhzwer

1 #include <iostream> 2 #include <algorithm> 3 #include <cstdlib> 4 #include <cstring> 5 #include <cstdio> 6 #include <queue> 7 8 using namespace std; 9 10 const int N=200000; 11 int h[N],r[N],to[N],from[N],cost[N],flow[N],tot,S,T,v[N],d[N],pre[N]; 12 queue<int>q; 13 14 void ins2(int u,int v,int f,int c){ 15 to[tot]=v; 16 from[tot]=u; 17 flow[tot]=f; 18 cost[tot]=c; 19 r[tot]=h[u]; 20 h[u]=tot++; 21 } 22 23 void ins(int u,int v,int f,int c){ 24 ins2(u,v,f,c); 25 ins2(v,u,0,-c); 26 } 27 28 bool SPFA(){ 29 memset(pre,-1,sizeof(pre)); 30 memset(d,0x3f,sizeof(d)); 31 d[S]=0; 32 v[S]=1; 33 q.push(S); 34 while(q.size()){ 35 int f=q.front();q.pop();v[f]=0; 36 for(int i=h[f];i!=-1;i=r[i]){ 37 int t=to[i]; 38 if(flow[i]&&d[t]>d[f]+cost[i]){ 39 d[t]=d[f]+cost[i]; 40 pre[t]=i; 41 if(!v[t])v[t]=1,q.push(t); 42 } 43 } 44 } 45 return d[T]!=0x3f3f3f3f; 46 } 47 48 int mcf(){ 49 int c=0,f; 50 while(SPFA()){ 51 f=0x3f3f3f3f; 52 for(int i=pre[T];i!=-1;i=pre[from[i]]){ 53 f=min(f,flow[i]); 54 } 55 for(int i=pre[T];i!=-1;i=pre[from[i]]){ 56 flow[i]-=f; 57 flow[i^1]+=f; 58 } 59 c+=f*d[T]; 60 } 61 return c; 62 } 63 64 int m,n,ASD[100][100]; 65 66 int main(){ 67 memset(h,-1,sizeof(h)); 68 scanf("%d%d",&m,&n); 69 for(int i=1;i<=n;i++){ 70 for(int j=1;j<=m;j++){ 71 scanf("%d",&ASD[i][j]); 72 } 73 } 74 S=0,T=1100; 75 for(int i=1;i<=m*n;i++)ins(S,i,1,0); 76 for(int i=m*n+1;i<=m*n+n;i++)ins(i,T,1,0); 77 for(int i=1;i<=m;i++) 78 for(int j=1;j<=n;j++) 79 for(int k=1;k<=n;k++) 80 ins((i-1)*n+j,n*m+k,1,ASD[k][i]*j); 81 printf("%.2lf\n",(double)mcf()/n); 82 }