为什么加了优化反而更慢求解惑
查看原帖
为什么加了优化反而更慢求解惑
362762
lzyzs楼主2023/8/9 08:50

这个是加了常数优化的 样例运行结果 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循环

2023/8/9 08:50
加载中...