bzoj1927最小费用最大流
其实本来打算做最小费用最大流的题目前先来点模板题的,,,结果看到这道题二话不说(之前打太多了)敲了一个dinic,快写完了发现不对
我当时就这表情→ =_=你TM逗我
刚要删突然感觉dinic的模板中的bfs就相当于找每天边的权都为1的图上的最短路,稍稍改一下就能变成spfa,于是重新写了一下,但是函数名还是bfs。。。
然后又发现不对,最后要返回路径的,dfs也要改= =结果变成了非递归,但是函数名还是dfs。。。
于是一个看似是dinic,实则垃圾得不行的最小费用最大流就敲完了
然后调了一小会儿,最后发现我把入点和入点连了起来。。。难怪每次算出来都是直接飞
1 #include <cstdio> 2 #include <iostream> 3 #define INF 2147483647 4 using namespace std; 5 int n,m,N=1,ans=0,x,y,z,h,t,i,minflow,now; 6 int fir[3000],nex[50000],to[50000],flo[50000],cost[50000],d[3000],l[30000],father[3000]; 7 bool que[3000]; 8 inline void add(int a,int b,int c,int d){ nex[++N]=fir[a];fir[a]=N;to[N]=b;flo[N]=c;cost[N]=d; 9 nex[++N]=fir[b];fir[b]=N;to[N]=a;flo[N]=0;cost[N]=-d;} 10 bool bfs()//其实是spfa 11 { 12 for(int i=1;i<=n*2+2;i++) d[i]=INF; 13 for(h=1,t=1,l[1]=n*2+1,d[n*2+1]=0;h<=t;h++) 14 for (que[l[h]]=0,i=fir[l[h]];i;i=nex[i]) 15 if(flo[i] && d[to[i]]>d[l[h]]+cost[i]) 16 { 17 father[to[i]]=i;//注意father存的是边 18 d[to[i]]=d[l[h]]+cost[i]; 19 if (!que[to[i]]) 20 l[++t]=to[i],que[to[i]]=1; 21 } 22 return d[n*2+2]!=INF; 23 } 24 25 void dfs()//其实写成了非递归 26 { 27 for(minflow=INF,now=n*2+2;now!=n*2+1;now=to[father[now]^1]) 28 minflow=min(minflow,flo[father[now]]); 29 for(now=n*2+2;now!=n*2+1;now=to[father[now]^1]) 30 ans+=cost[father[now]],flo[father[now]]-=minflow,flo[father[now]^1]+=minflow; 31 } 32 33 int main() 34 { 35 scanf("%d%d",&n,&m); 36 for (int i=1;i<=n;i++) 37 scanf("%d",&x),add(n*2+1,i+n,1,x); 38 for (int i=1;i<=n;i++) 39 add(n*2+1,i,1,0); 40 for (int i=1;i<=m;i++) 41 scanf("%d%d%d",&x,&y,&z),add(min(x,y),max(x,y)+n,1,z); 42 for (int i=1;i<=n;i++) 43 add(i+n,n*2+2,1,0); 44 while (bfs()) dfs(); 45 printf("%d\n",ans); 46 return 0; 47 }