【BZOJ 3144】 [Hnoi2013]切糕
原来dinic没学好啊
竟然还有个重要优化!
1 #include <cstdio>
2 #include <iostream>
3 #include <cstring>
4 #include <algorithm>
5 using namespace std;
6 #define MAXN 60
7 #define INF 10000000
8 int P,Q,R,D,s,t;
9 int id[MAXN][MAXN][MAXN],cnt=0;
10 int xx[5]={0,0,0,1,-1};
11 int yy[5]={0,1,-1,0,0};
12 int init[MAXN][MAXN][MAXN];
13 int team[1000000],head,tail;
14 int d[100000];
15 int g[1000000],num[2000000],nnext[2000000],flow[2000000],tot=2;
16 inline void Add(int x,int y,int z)
17 {
18 // cout<<x<<' '<<y<<' '<<z<<endl;
19 nnext[tot]=g[x];
20 g[x]=tot;
21 num[tot]=y;
22 flow[tot]=z;
23 tot++;
24
25 nnext[tot]=g[y];
26 g[y]=tot;
27 num[tot]=x;
28 flow[tot]=0;
29 tot++;
30 }
31 inline bool bfs()
32 {
33 head=tail=0;
34 memset(d,0,sizeof(d));
35 team[++tail]=s;d[s]=1;
36 while(head<tail)
37 {
38 int x=team[++head];
39 for(int i=g[x];i;i=nnext[i])
40 if(d[num[i]]==0&&flow[i]>0)
41 {
42 d[num[i]]=d[x]+1;
43 team[++tail]=num[i];
44 }
45 }
46 if(d[t]==0) return false;
47 return true;
48 }
49 int dfs(int x,int mmin)
50 {
51 if(x==t) return mmin;
52 int tmp,f=0;
53 for(int i=g[x];i;i=nnext[i])
54 if(d[num[i]]==d[x]+1&&flow[i]>0&&(tmp=dfs(num[i],min(mmin,flow[i]))))
55 {
56 mmin-=tmp;
57 f+=tmp;
58 flow[i]-=tmp;
59 flow[i^1]+=tmp;
60 if(mmin==0)
61 return f;
62 }
63
64
65
66
67
68
69
70
71
72
73
74
75
76 if(f==0) d[x]=0;
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91 return f;
92 }
93 int main()
94 {
95 //cin>>P>>Q>>R;
96 scanf("%d %d %d",&P,&Q,&R);
97 // cin>>D;
98 scanf("%d",&D);
99 for(int i=1;i<=R;i++)
100 for(int j=1;j<=P;j++)
101 for(int k=1;k<=Q;k++)
102 id[j][k][i]=++cnt,
103 scanf("%d",&init[j][k][i]);
104 s=++cnt;
105 t=++cnt;
106 // cout<<cnt<<endl;
107 for(int i=1;i<=P;i++)
108 for(int j=1;j<=Q;j++)
109 {
110 id[i][j][0]=s;
111 id[i][j][R+1]=t;
112 init[i][j][R+1]=INF;
113 for(int k=1;k<=R+1;k++)
114 {
115 Add(id[i][j][k-1],id[i][j][k],init[i][j][k]);
116 if(k-D>=1&&k!=R+1)
117 for(int l=1;l<=4;l++)
118 if(i+xx[l]>=1&&i+xx[l]<=P&&j+yy[l]>=1&&j+yy[l]<=Q)
119 Add(id[i][j][k],id[i+xx[l]][j+yy[l]][k-D],INF);
120 }
121 }
122 int ans=0;
123 while(bfs()) ans+=dfs(s,INF);
124 //cout<<ans;
125 printf("%d\n",ans);
126 return 0;
127 }
2 #include <iostream>
3 #include <cstring>
4 #include <algorithm>
5 using namespace std;
6 #define MAXN 60
7 #define INF 10000000
8 int P,Q,R,D,s,t;
9 int id[MAXN][MAXN][MAXN],cnt=0;
10 int xx[5]={0,0,0,1,-1};
11 int yy[5]={0,1,-1,0,0};
12 int init[MAXN][MAXN][MAXN];
13 int team[1000000],head,tail;
14 int d[100000];
15 int g[1000000],num[2000000],nnext[2000000],flow[2000000],tot=2;
16 inline void Add(int x,int y,int z)
17 {
18 // cout<<x<<' '<<y<<' '<<z<<endl;
19 nnext[tot]=g[x];
20 g[x]=tot;
21 num[tot]=y;
22 flow[tot]=z;
23 tot++;
24
25 nnext[tot]=g[y];
26 g[y]=tot;
27 num[tot]=x;
28 flow[tot]=0;
29 tot++;
30 }
31 inline bool bfs()
32 {
33 head=tail=0;
34 memset(d,0,sizeof(d));
35 team[++tail]=s;d[s]=1;
36 while(head<tail)
37 {
38 int x=team[++head];
39 for(int i=g[x];i;i=nnext[i])
40 if(d[num[i]]==0&&flow[i]>0)
41 {
42 d[num[i]]=d[x]+1;
43 team[++tail]=num[i];
44 }
45 }
46 if(d[t]==0) return false;
47 return true;
48 }
49 int dfs(int x,int mmin)
50 {
51 if(x==t) return mmin;
52 int tmp,f=0;
53 for(int i=g[x];i;i=nnext[i])
54 if(d[num[i]]==d[x]+1&&flow[i]>0&&(tmp=dfs(num[i],min(mmin,flow[i]))))
55 {
56 mmin-=tmp;
57 f+=tmp;
58 flow[i]-=tmp;
59 flow[i^1]+=tmp;
60 if(mmin==0)
61 return f;
62 }
63
64
65
66
67
68
69
70
71
72
73
74
75
76 if(f==0) d[x]=0;
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91 return f;
92 }
93 int main()
94 {
95 //cin>>P>>Q>>R;
96 scanf("%d %d %d",&P,&Q,&R);
97 // cin>>D;
98 scanf("%d",&D);
99 for(int i=1;i<=R;i++)
100 for(int j=1;j<=P;j++)
101 for(int k=1;k<=Q;k++)
102 id[j][k][i]=++cnt,
103 scanf("%d",&init[j][k][i]);
104 s=++cnt;
105 t=++cnt;
106 // cout<<cnt<<endl;
107 for(int i=1;i<=P;i++)
108 for(int j=1;j<=Q;j++)
109 {
110 id[i][j][0]=s;
111 id[i][j][R+1]=t;
112 init[i][j][R+1]=INF;
113 for(int k=1;k<=R+1;k++)
114 {
115 Add(id[i][j][k-1],id[i][j][k],init[i][j][k]);
116 if(k-D>=1&&k!=R+1)
117 for(int l=1;l<=4;l++)
118 if(i+xx[l]>=1&&i+xx[l]<=P&&j+yy[l]>=1&&j+yy[l]<=Q)
119 Add(id[i][j][k],id[i+xx[l]][j+yy[l]][k-D],INF);
120 }
121 }
122 int ans=0;
123 while(bfs()) ans+=dfs(s,INF);
124 //cout<<ans;
125 printf("%d\n",ans);
126 return 0;
127 }