bfs 70pts TLE 求优化
查看原帖
bfs 70pts TLE 求优化
945742
hexuchen楼主2025/2/7 09:01
#include <bits/stdc++.h>
using namespace std;
struct city{
	int st,en;
}cities[510];
int n,m,s[510][510],L=1,ans=0;
int dh[5]={0,-1,0,1,0};
int dl[5]={0,0,1,0,-1};
bool f[510][510][510],p[510];
bool cmp(city a,city b){
	return a.st<b.st;
}
void bfs(int r,int c,int j){
	queue<int> qx,qy;
	qx.push(r);
	qy.push(c);
	f[j][r][c]=true;
	if(n==1){
		p[c]=true;
	}
	while(!qx.empty()){
		int x=qx.front(),y=qy.front();
		qx.pop();
		qy.pop();
		for(int i=1;i<=4;i++){
			int dx=x+dh[i],dy=y+dl[i];
			if(dx>=1 && dx<=n && dy>=1 && dy<=m){
				if(!f[j][dx][dy] && s[dx][dy]<s[x][y]){
					f[j][dx][dy]=true;
					qx.push(dx);
					qy.push(dy);
					if(dx==n){
						p[dy]=true;
						cities[j].st=(cities[j].st==0?dy:min(cities[j].st,dy));
						cities[j].en=(cities[j].en==0?dy:max(cities[j].en,dy));
					}
				}
			}
		}
	}
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>s[i][j];
		}
	}
	for(int i=1;i<=m;i++){
		bfs(1,i,i);
	}
	int city_num=0;
	for(int i=1;i<=m;i++){
		if(!p[i]){
			city_num++;
		}
	}
	if(city_num){
		cout<<"0\n"<<city_num;
		return 0;
	}
	cout<<"1\n";
	sort(cities+1,cities+1+n,cmp);
	while(L<=m){
		//cout<<L<<endl;
		int maxa=-1,maxn=-1e9;
		for(int i=1;i<=m;i++){
			if(cities[i].st<=L){
				if(cities[i].en>maxn){
					maxa=i;
					maxn=cities[i].en;
				}
			}
		}
		L=cities[maxa].en+1;
		ans++;
	}
	cout<<ans;
	return 0;
}
/*
8 4 5 6 4 4
7 3 4 3 3 3
3 2 2 1 1 2

8 4 - - - 4
7 3 4 - - 3
3 2 2 - - 2

1 1~2
2 2
3 2~3
4 2~5
5 5
6 6
*/
2025/2/7 09:01
加载中...