这个是加了常数优化的 样例运行结果 cntt输出414
#include <bits/stdc++.h>
#define int long long
const int N=1e6+4000;
const int MAXX=0x3fffff;
using namespace std;
struct edge{
int next,wide,fa;
}temp;
vector<edge> ma[N];
int n,m,e,now[N],dis[N],over,ans,s,vis[N];
int sdb[8]={-1,0,0,-1,1,0,0,1};
bool check(int x,int y)
{
return x>=1&&y>=1&&x<=n&&y<=m;
}
void add(int x,int y,int wide=1)
{
// cout << x << ' ' << y << ' ' << wide << endl;
temp.next=y;
temp.wide=wide;
temp.fa=ma[y].size();
ma[x].push_back(temp);
temp.next=x;
// temp.wide=0;
temp.fa=ma[x].size()-1;
ma[y].push_back(temp);
}
int cntt;
bool bfs()
{
memset(dis, -1, sizeof dis);
// for(int i=0;i<=over;i++) dis[i]=MAXX;
queue<int> q;
q.push(s);
now[s]=0,dis[s]=0;
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=0;i<ma[x].size();i++)
{
cntt++;
if(ma[x][i].wide>0&&dis[ma[x][i].next]==-1)
{
dis[ma[x][i].next]=dis[x]+1;
now[ma[x][i].next]=0;
q.push(ma[x][i].next);
}
}
}
return dis[over]!=-1;
}
int dfs(int index,int cnt)
{
if(index==over) return cnt;
int res=0;
for(/*now[index]=0*/;now[index]<ma[index].size()&&cnt;now[index]++)
{
// cout << now[index] << endl;
cntt++;
edge ne=ma[index][now[index]];
if(ne.wide>0&&dis[index]+1==dis[ne.next])
{
int te=dfs(ne.next,min(cnt,ne.wide));
if(!te)dis[ne.next]=-1;
ma[index][now[index]].wide-=te;
ma[ne.next][ne.fa].wide+=te;
cnt-=te;
res+=te;
}
}
return res;
}
int fup[666][666],color[666][666],all[N],x,y;
int get(int a,int b){return (a-1)*m+b;}
signed main()
{
cin >> n >> m;
s=get(1,1),over=get(n,m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<m;j++)
{
cin >> x;
add(get(i,j),get(i,j+1),x);
}
}
for(int i=1;i<n;i++)
{
for(int j=1;j<=m;j++)
{
cin >> x;
add(get(i,j),get(i+1,j),x);
}
}
for(int i=1;i<n;i++)
{
for(int j=1;j<m;j++)
{
cin >> x;
add(get(i,j),get(i+1,j+1),x);
}
}
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=m;j++)
// {
// cout << i*m+j << ' ';
// }
// cout << endl;
// }
while(bfs())
{
ans+=dfs(s,MAXX);
cout << cntt << endl;
}
cout << ans << endl;
return 0;
}
这个是不加常数优化的 样例运行结果 cntt输出250(不是骂人)
#include <bits/stdc++.h>
#define int long long
const int N=1e6+4000;
const int MAXX=0x3fffff;
using namespace std;
struct edge{
int next,wide,fa;
}temp;
vector<edge> ma[N];
int n,m,e,now[N],dis[N],over,ans,s,vis[N];
int sdb[8]={-1,0,0,-1,1,0,0,1};
bool check(int x,int y)
{
return x>=1&&y>=1&&x<=n&&y<=m;
}
void add(int x,int y,int wide=1)
{
// cout << x << ' ' << y << ' ' << wide << endl;
temp.next=y;
temp.wide=wide;
temp.fa=ma[y].size();
ma[x].push_back(temp);
temp.next=x;
// temp.wide=0;
temp.fa=ma[x].size()-1;
ma[y].push_back(temp);
}
int cntt;
bool bfs()
{
memset(dis, -1, sizeof dis);
// for(int i=0;i<=over;i++) dis[i]=MAXX;
queue<int> q;
q.push(s);
now[s]=0,dis[s]=0;
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=0;i<ma[x].size();i++)
{
cntt++;
if(ma[x][i].wide>0&&dis[ma[x][i].next]==-1)
{
dis[ma[x][i].next]=dis[x]+1;
now[ma[x][i].next]=0;
q.push(ma[x][i].next);
}
}
}
return dis[over]!=-1;
}
int dfs(int index,int cnt)
{
if(index==over) return cnt;
int res=0;
for(now[index]=0;now[index]<ma[index].size()&&cnt;now[index]++)
{
// cout << now[index] << endl;
cntt++;
edge ne=ma[index][now[index]];
if(ne.wide>0&&dis[index]+1==dis[ne.next])
{
int te=dfs(ne.next,min(cnt,ne.wide));
if(!te)dis[ne.next]=-1;
ma[index][now[index]].wide-=te;
ma[ne.next][ne.fa].wide+=te;
cnt-=te;
res+=te;
}
}
return res;
}
int fup[666][666],color[666][666],all[N],x,y;
int get(int a,int b){return (a-1)*m+b;}
signed main()
{
cin >> n >> m;
s=get(1,1),over=get(n,m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<m;j++)
{
cin >> x;
add(get(i,j),get(i,j+1),x);
}
}
for(int i=1;i<n;i++)
{
for(int j=1;j<=m;j++)
{
cin >> x;
add(get(i,j),get(i+1,j),x);
}
}
for(int i=1;i<n;i++)
{
for(int j=1;j<m;j++)
{
cin >> x;
add(get(i,j),get(i+1,j+1),x);
}
}
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=m;j++)
// {
// cout << i*m+j << ' ';
// }
// cout << endl;
// }
while(bfs())
{
ans+=dfs(s,MAXX);
cout << cntt << endl;
}
cout << ans << endl;
return 0;
}
求大佬解惑,不一样的地方在dfs内的for循环