连通分量

最大路径和

一定用dfs,如下图当所有方向都可以走的时候bfs并不能完整的一整条因为同时打的标1-2 1-3 标志2-3不可能 万一这是最大路径?
探险家的题目用0隔开给你一种可以输出完整一条的错觉
image

#include <bits/stdc++.h>
using namespace std;
int ans=0;
int g[105][105];int n,m;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
void dfs(int x,int y,int w)//我们这里定义到达这里的时侯的路径和
{
	ans=max(ans,w);//找所有路径-所有点的最大
	for(int i=0;i<4;i++)
	{
		int nx=x+dx[i];int ny=y+dy[i];int nw=w+g[nx][ny];
		if(nx<0 ||nx>=n||ny<0||ny>=m) continue;
		if(g[nx][ny]==0) continue;
		int tt=g[nx][ny];
		g[nx][ny]=0;
		dfs(nx,ny,nw);
		g[nx][ny]=tt;
	}
}
int main()
{
	while(cin>>n>>m)
	{
		ans=0;
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<m;j++)
			{
				cin>>g[i][j];
			}
		}
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<m;j++)
			{
				if(g[i][j]!=0)
				{
					int tt=g[i][j];
					g[i][j]=0;
					dfs(i,j,tt);//修改了 
					g[i][j]=tt;
				}
			}
		}
	cout<<ans<<endl;
	}
}

不对的bfs牢记

#include <bits/stdc++.h>
using namespace std;
struct node
{
	int x,y,v;
};
int ans=0;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int n,m;
int visited[105][105];
int g[105][105];
void bfs(int x,int y,int v)
{
	queue<node>pq;
	pq.push({x,y,v});
	while(!pq.empty())
	{
		auto it=pq.front();
		pq.pop();
		int cx=it.x;int cy=it.y;int cv=it.v;
		ans=max(ans,cv);
		for(int i=0;i<4;i++)
		{
			int nx=cx+dx[i];int ny=cy+dy[i];
			if(nx<0||nx>=n||ny<0||ny>=m) continue;
			if(g[nx][ny]==0)continue;
			if(visited[nx][ny]) continue;
			int nv=cv+g[nx][ny];
			visited[nx][ny]=1;
			pq.push({nx,ny,nv});
		}
	}
}
int main()
{
	while(cin>>n>>m)
	{
		ans=0;
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<m;j++)
			{
				cin>>g[i][j];
			}
		}
		int num=1;
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<m;j++)
			{
				if(g[i][j]!=0)
				{
					meset(visited,0,sizeof(visited));
					visited[i][j]=1;
					bfs(i,j,g[i][j]);
				}
			}
		}
		cout<<ans<<endl;
	}
}

联通个数

所有联通点的个数和求和都是可以用bfs dfs的

#include <bits/stdc++.h>
using namespace std;
int dx[8]={1,-1,0,0,1,1,-1,-1};
int dy[8]={0,0,1,-1,1,-1,-1,1};
int n,m;
char g[105][105];
void bfs(int sx,int sy)
{
	queue<pair<int,int> >pq;
	pq.push({sx,sy});
	while(!pq.empty())
	{
		auto it=pq.front();
		pq.pop();
		int x=it.first;int y=it.second;
		cout<<x<<" "<<y<<endl;
		for(int i=0;i<8;i++)
		{
			int nx=x+dx[i];int ny=y+dy[i];
			if(nx>=0&&nx<n&&ny>=0&&ny<m)//这个=我真找了半天
			{
				if(g[nx][ny]=='@')
				{
					g[nx][ny]='*';
					pq.push({nx,ny});
				}
			}
		}
	}
}

int main()
{
	while(cin>>n>>m)
	{
		int cc=0;
		for(int i=0;i<n;i++)
		{
			scanf("%s",g[i]);
		}
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<m;j++)
			{
				if(g[i][j]=='@')
				{
					g[i][j]='*';
					bfs(i,j);
					cc++;
				}
			}
		 }
		
		 cout<<cc<<endl; 
	}
}
posted @ 2025-11-24 16:37  ll今天也要加油啊  阅读(1)  评论(0)    收藏  举报