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 }

 

posted @ 2016-08-30 15:16  汪立超  阅读(218)  评论(0编辑  收藏  举报